子命令标志(选项)



我正在尝试创建一个CLI应用程序,该应用程序将使用标准标志包接受基于子命令的几个参数。这是我尝试使用的代码:

package main
import (
"flag"
"fmt"
"os"
)
func main() {
fmt.Printf("start applicationn")
fooCmd := flag.NewFlagSet("foo", flag.ExitOnError)
fooName := fooCmd.String("name", "", "name")
barCmd := flag.NewFlagSet("bar", flag.ExitOnError)
barLevel := barCmd.Int("level", 0, "level")
if len(os.Args) < 2 {
fmt.Println("expected 'foo' or 'bar' subcommands")
os.Exit(1)
}
switch os.Args[1] {
case "foo":
fooCmd.Parse(os.Args[2:])
fmt.Println("  name:", *fooName)
case "bar":
barCmd.Parse(os.Args[2:])
fmt.Println("  level:", *barLevel)
default:
fmt.Println("expected 'foo' or 'bar' subcommands")
os.Exit(1)
}
}

并通过调用:

$ ./main foo -name=test

它正在按预期工作。

问题是,我想有另一个标志(比如--loglevel=Debug(,它应该为任何子命令(foo/bar(调用,比如:

$ ./main foo -name=test -loglevel=debug

一种选择是为这些子命令中的任何一个创建相同的标志(loglevel(,但我只是想知道有没有其他方法可以在不复制代码的情况下实现这一点
在我的情况下,我有大约6个子命令和4个";一般的";旗帜。

这就是为什么我更喜欢使用第三方库,而不是默认的flags包
例如,使用alecthomas/kong:

func TestPropagatedFlags(t *testing.T) {
var cli struct {
Flag1    string
Command1 struct {
Flag2    bool
Command2 struct{} `kong:"cmd"`
} `kong:"cmd"`
}
parser := mustNew(t, &cli)
_, err := parser.Parse([]string{"command-1", "command-2", "--flag-2", "--flag-1=moo"})
require.NoError(t, err)
require.Equal(t, "moo", cli.Flag1)
require.Equal(t, true, cli.Command1.Flag2)
}

Flag1是全局的,将应用于任何子命令。

最新更新