5

我寻找了一些类似的问题,但除了这个我找不到任何东西: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 开头的破折号参数?

4

3 回答 3

5

与虚拟的所有 Unix 风格的命令行实用程序和标志解析库一样,Cobra 使用 a 将标志与参数分开--,之后不再将参数解析为标志,即使它们以 a 开头-

go run myapp exampleCmd set -- "-Dexample"

这与您与其他 CLI 实用程序的交互方式没有什么不同。例如,rm -i设置interactive标志,同时rm -- -i删除名为-i.

您绝对希望任意禁用某些命令或子命令的标志,这些标志或子命令不一致(在您自己的应用程序和所有其他应用程序中)、不必要且违反基本用户期望:有时,-h会做用户期望的事情,但对于某些由于用户无法预测的原因,命令-h将被视为参数并产生意外行为。

Unix 已经解决了这个问题超过 50 年。让用户通过 决定参数是否为标志--

于 2021-11-28T19:42:47.090 回答
-1

我认为dash在使用类似cobra. 这dash是一个标志指示符,它是否用引号括起来并不重要,singledash被读取为速记标志,因此您输入的第一个字母被解释为标志并且无法识别,因此程序失败(并调用cmd.Help()) .

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

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

于 2021-11-28T19:39:30.007 回答
-1

使用此解决方法解决(如果是)

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

DisableFlagParsing: true,

在这里找到:https ://github.com/spf13/cobra/issues/683

于 2021-11-28T19:28:59.730 回答