猿问

如何将标志作为 urface/cli 命令的参数传递?

我正在使用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]


翻翻过去那场雪
浏览 160回答 1
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        },    },}
随时随地看视频慕课网APP

相关分类

Go
我要回答