无法在 Cobra 参数中插入破折号

问题描述 投票:0回答:4

我寻找了一些类似的问题,但除了这个我找不到任何东西:https://github.com/spf13/cobra/issues/1025

我的问题是插入一些开头包含破折号的字符串,如下例所示,

go run myapp exampleCmd set "-Dexample"

Cobra 似乎将输入

-Dexample
作为内部参数,因为返回以下输出:

Error: unknown shorthand flag: 'D' in -Dexample
Usage:
  myapp exampleCmd set [flags]

Flags:
  -h, --help   help for set

Global Flags:
  -s, --set string       Set exampleCmd parameters. (default "default_param")

我的

init()
函数包含这两行:

func init() {
    ...
    exampleCmd.PersistentFlags().StringP("set", "s", defaultArgument, "Set parameters.")
    exampleCmd.AddCommand(setCmd)
    ...
}

var exampleCmd = &cobra.Command{
    Use:   "set",
    Short: "set parameter",
    Long:  `set parameter`,
    RunE: func(cmd *cobra.Command, args []string) error {
        if len(args) != 1 && len(args) != 0 {
            color.Red("Wrong usage, insert just a parameter")
        } else if len(args) == 0 {
            color.Yellow("Setting default parameter: " + defaultArgument)
            internal.SetParams(defaultArgument)
        } else {
            internal.SetParams(args[0])
        }
        return nil
    },
}

如何接受以 Cobra 开头的带有破折号的参数,如果存在任何解决方案?

go go-cobra
4个回答
6
投票

与虚拟所有 Unix 风格的命令行实用程序和标志解析库一样,Cobra 使用

--
将标志与参数分开,之后不再有任何参数将被解析为标志,即使它们以
-
开头。

go run myapp exampleCmd set -- "-Dexample"

这与您与其他 CLI 实用程序交互的方式没有什么不同。例如,

rm -i
设置
interactive
标志,而
rm -- -i
删除名为
-i
的文件。

您绝对不想想要任意禁用某些命令或子命令的标志,这些标志是不一致的(在您自己的应用程序内和所有其他应用程序之间)、不必要的,并且违反了基本的用户期望:有时,-h

会做用户期望的,但对于某些命令,由于用户无法预测的原因,
-h
将被视为参数并产生意外的行为。

Unix 已经解决这个问题 50 多年了。让用户通过

--

 来决定参数是否为标志。


-1
投票
使用此解决方法解决了(如果是)

我在 &cobra.Command{} 的末尾添加了这个元素:

DisableFlagParsing: true,
在这里找到:

https://github.com/spf13/cobra/issues/683


-1
投票
我认为在使用像

dash

这样的实用程序时不可能传递以
cobra
符号开头的参数。 
dash
 是一个标志指示符,如果用引号括起来并不重要,单个 
dash
 会被读取为速记标志,因此您输入的第一个字母会被解释为标志并且无法识别,因此程序失败(并调用 
cmd.Help()
)。

您已将

set

 设置为命令和标志 (
--set
 
-s
),因此它会出现在您的 
--help
 输出中。

我会考虑为命令参数使用不同的字符或在内部以其他方式添加它。


-1
投票
我在flagset interspersed选项中找到了解决方案:

https://github.com/spf13/cobra/issues/1307#issue-777308697

这对 cobra 来说,第一个标志之后的其他标志也是标志。

© www.soinside.com 2019 - 2024. All rights reserved.