我正在实现一个带有多个子命令的小CLI。我想支持全局标志,即适用于所有子命令以避免重复它们的标志。
例如,在下面的示例中,我试图拥有所有子命令所需的标志。-required
package main
import (
"flag"
"fmt"
"log"
"os"
)
var (
required = flag.String(
"required",
"",
"required for all commands",
)
fooCmd = flag.NewFlagSet("foo", flag.ExitOnError)
barCmd = flag.NewFlagSet("bar", flag.ExitOnError)
)
func main() {
flag.Parse()
if *required == "" {
fmt.Println("-required is required for all commands")
}
switch os.Args[1] {
case "foo":
fooCmd.Parse(os.Args[2:])
fmt.Println("foo")
case "bar":
barCmd.Parse(os.Args[2:])
fmt.Println("bar")
default:
log.Fatalf("[ERROR] unknown subcommand '%s', see help for more details.", os.Args[1])
}
}
我希望用法是这样的:
$ go run main.go foo -required helloworld
但是如果我用上面的代码运行它,我得到:
$ go run main.go foo -required hello
-required is required for all commands
flag provided but not defined: -required
Usage of foo:
exit status 2
它看起来像是没有从CLI捕获,然后抱怨我给了它一个它无法识别的标志。flag.Parse()-requiredfooCmd
在 Golang 中使用带有全局标志的子命令的最简单方法是什么?
杨__羊羊
翻翻过去那场雪
相关分类