go - 如何使用urfave/cli实现OptionFlag

标签 go command-line-interface

有没有一种方法可以用urfave/cli定义OptionFlag?

我正在寻找看起来像这样的东西。

mycli --format json
mycli --format xml

我知道我可以使用StringFlag,但是如果我可以让--help显示此标志的有效选项/值,那就太好了,因此对于mycli的最终用户来说是透明的。

这样,还可以根据选项来验证Flag,以通知用户他为此标志提供了无效值。当然,使用StringFlag也可以做到这一点,但宁愿做些复杂的事情来完成所有这些工作。

我还在Github存储库中提出了一个问题。也许这是一个缺少的功能,我很乐意为您提供一些指导。

https://github.com/urfave/cli/issues/1154

最佳答案

我认为您想要StringSliceFlag它允许您为标志定义有效/默认值。

package main

import (
    "fmt"
    "log"
    "os"

    "github.com/urfave/cli/v2"
)

func main() {

    validMeetings := []string{"standup", "postmortem", "jourfix"}
    meetings := cli.NewStringSlice(validMeetings...)

    app := &cli.App{
        Flags: []cli.Flag{
            &cli.StringSliceFlag{
             Value: meetings,
             Name: "meeting",
             Usage: "use one of the default values"},
        },
        Action: func(c *cli.Context) error {

            m := c.StringSlice("meeting")
            ok := false
            for _, selected := range m {
                for _, valid := range validMeetings {
                    if selected == valid {
                        ok = true
                    }
                }
            }
            if !ok {
                return fmt.Errorf("you must use one of %v", validMeetings)
            }

            fmt.Printf("%s\n", c.String("meeting"))
            return nil
        },
    }

    err := app.Run(os.Args)
    if err != nil {
        log.Fatal(err)
    }
}

https://github.com/urfave/cli/blob/4f74020d9f07911f0fdb8facbc1f557a12cd2a93/app_test.go#L760

关于go - 如何使用urfave/cli实现OptionFlag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62472518/

相关文章:

select - 跳出选择循环?

vb.net - 如何在 VB 8.0 中编写 MS-DOS 程序?

C# Oakton 标志与参数

memory-leaks - 这会导致 Go 中的内存泄漏吗?

function - go 的 len() 和 make() 函数是如何工作的?

select - 如何在选择的父级范围内运行的选择案例中调用 goroutine

http - 在 root 和 rest on/api 上提供静态内容

clojure - 使用 Clojure CLI 工具启动 nREPL

github - 通过命令行在 Github Pull Request 上发表评论

node.js - 如何从本地安装运行expressJS CLI