【问题标题】:How to pass flags as argument of urface/cli command?如何将标志作为 urface/cli 命令的参数传递?
【发布时间】: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

标签: go command-line-interface


【解决方案1】:

查看cli.Command的文档后,其实有一个非常简单的方法来拥有我想要的东西:将SkipFlagParsing设置为true会将所有标志视为普通参数。

app.Commands = []cli.Command{
    {
        Name:    "test",
        SkipFlagParsing: true
        Action:  func(c *cli.Context) error {
            fmt.Println("test", c.Args())
            return nil
        },
    },
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-12
    • 2021-07-22
    • 2012-03-25
    • 1970-01-01
    • 2011-09-06
    • 2016-04-09
    • 1970-01-01
    • 2018-04-29
    相关资源
    最近更新 更多