Go语言:如何用urfave/cli实现BoolFlag短参数合并?求替代方案
问题
我用Go语言的urfave/cli包(第二流行的Go命令行参数解析器)编写了一段代码,可解析-f/--foo和-b/--bar两个布尔类型参数。当前程序支持go run . -f -b的运行方式,但无法识别go run . -fb这种将短参数合并的形式。
请问是否可以通过urfave/cli实现支持go run . -fb的功能?若不可行,有哪些Go模块可以实现该功能?
代码示例
package main import ( "fmt" "log" "os" "github.com/urfave/cli/v2" ) func main() { var foo_count, bar_count bool app := &cli.App{ Flags: []cli.Flag{ &cli.BoolFlag{ Name: "foo", Usage: "Foo", Aliases: []string{"f"}, Destination: &foo_count, }, &cli.BoolFlag{ Name: "bar", Usage: "Bar", Aliases: []string{"b"}, Destination: &bar_count, }, }, Action: func(cCtx *cli.Context) error { fmt.Println("foo_count", foo_count) fmt.Println("bar_count", bar_count) return nil }, } if err := app.Run(os.Args); err != nil { log.Fatal(err) } }
测试结果
$ go run . -f foo_count true bar_count false $ go run . -b foo_count false bar_count true $ go run . -bf 使用错误:提供了未定义的flag:-bf 名称: main - 一个新的cli应用 用法: main [全局选项] 命令 [命令选项] [参数...] 命令: help, h 显示命令列表或单个命令的帮助信息 全局选项: --foo, -f Foo (默认值: false) --bar, -b Bar (默认值: false) --help, -h 显示帮助 2023/03/25 15:54:00 flag provided but not defined: -bf exit status 1
回答
urfave/cli v2版本不支持短布尔参数合并(如-fb这种将多个短参数合并为一个的写法),这是该库的设计限制,官方文档明确说明短参数只能单独使用,无法合并。
如果需要支持短参数合并,可以考虑以下几个Go模块:
- cobra:目前最流行的Go CLI开发框架,原生支持短参数合并,同时提供嵌套命令、自动补全、文档生成等丰富功能,被Kubernetes、Hugo等大量知名项目采用。
- pflag:是Go标准库
flag的扩展,完全兼容标准库API,同时新增了短参数合并、位置参数、自定义类型解析等特性,适合需要轻量扩展的场景。 - kingpin:成熟的CLI参数解析库,支持短参数合并、自动类型推断、命令行交互等功能,API设计简洁直观,上手成本低。
示例:用cobra实现短参数合并
以下是一个简单的cobra示例,实现-fb合并参数的支持:
package main import ( "fmt" "os" "github.com/spf13/cobra" ) var foo bool var bar bool func main() { var rootCmd = &cobra.Command{ Use: "main", Short: "A new cli application", Run: func(cmd *cobra.Command, args []string) { fmt.Println("foo:", foo) fmt.Println("bar:", bar) }, } rootCmd.Flags().BoolVarP(&foo, "foo", "f", false, "Foo") rootCmd.Flags().BoolVarP(&bar, "bar", "b", false, "Bar") if err := rootCmd.Execute(); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } }
测试时运行go run . -fb,会输出:
foo: true bar: true
内容的提问来源于stack exchange,提问作者milaniez
相关产品推荐
相关产品推荐

