【发布时间】:2019-06-25 13:39:26
【问题描述】:
我正在使用urfave/cli 在 Go 中构建一个 CLI 应用程序。
我想要的是在第一个命令之后给出的选项被视为参数而不是标志(以便我可以自己处理它们或将它们传递给其他可执行文件)。
使用app.Action(见下文)时,这是我得到的行为,但如果我使用cli.Commands,则会出现错误。
package main
import (
"fmt"
"github.com/urfave/cli"
"log"
"os"
)
func main() {
app := cli.NewApp()
app.Commands = []cli.Command{
{
Name: "test",
Action: func(c *cli.Context) error {
fmt.Println("test", c.Args())
return nil
},
},
}
app.Action = func(c *cli.Context) error {
fmt.Println(c.Args())
return nil
}
err := app.Run(os.Args)
if err != nil {
log.Fatal(err)
}
}
输出:go run main.go cmd -f flag:
[cmd -f flag]
但go run main.go test cmd -f flag 退出时出现我希望输出的错误
test [cmd -f flag]
【问题讨论】:
-
你得到的错误是什么?它对我有用,它输出
[test cmd -f flag]! -
我在命令名称中打错了字(
test2而不是test)。我得到的错误是“不正确的用法:提供但未定义的标志:-f” -
@Abdullah 我修正了我的问题中的错字。您必须输入
go run main.go test2 cmd -f flag才能得到旧版本的错误。 -
你忘记了
app.Name。使用go run main.go main test cmd -f flag。这将输出:[main test cmd -f flag] -
不,我没有。也许我不够清楚。当我的程序的命令是
test(如app.Commands中定义)时,我收到错误消息。任何其他命令,包括main,都会在没有问题的情况下调用app.Action。