我有一个代码可以获取
-f/--foo
或-b/--bar
的参数。参数解析是通过 urfave/cli 包完成的,它是第二流行的 Go 参数解析器。我可以像 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
Incorrect Usage: flag provided but not defined: -bf
NAME:
main - A new cli application
USAGE:
main [global options] command [command options] [arguments...]
COMMANDS:
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--foo, -f Foo (default: false)
--bar, -b Bar (default: false)
--help, -h show help
2023/03/25 15:54:00 flag provided but not defined: -bf
exit status 1
这个问题在其中一个包示例中得到了专门解决。在创建 cli 时添加
UseShortOptionHandling: true
。
https://github.com/urfave/cli/blob/main/docs/v2/examples/combining-short-options.md
来自文档: 这可以在您的应用程序配置中使用
UseShortOptionHandling
布尔来完成,或者通过将其附加到命令配置来用于单个命令。