我寻找了一些类似的问题,但除了这个我找不到任何东西: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 开头的带有破折号的参数,如果存在任何解决方案?
与虚拟所有 Unix 风格的命令行实用程序和标志解析库一样,Cobra 使用
--
将标志与参数分开,之后不再有任何参数将被解析为标志,即使它们以 -
开头。
go run myapp exampleCmd set -- "-Dexample"
这与您与其他 CLI 实用程序交互的方式没有什么不同。例如,
rm -i
设置 interactive
标志,而 rm -- -i
删除名为 -i
的文件。
您绝对不想想要任意禁用某些命令或子命令的标志,这些标志是不一致的(在您自己的应用程序内和所有其他应用程序之间)、不必要的,并且违反了基本的用户期望:有时,-h
会做用户期望的,但对于某些命令,由于用户无法预测的原因,
-h
将被视为参数并产生意外的行为。Unix 已经解决这个问题 50 多年了。让用户通过
--
来决定参数是否为标志。
dash
这样的实用程序时不可能传递以
cobra
符号开头的参数。
dash
是一个标志指示符,如果用引号括起来并不重要,单个
dash
会被读取为速记标志,因此您输入的第一个字母会被解释为标志并且无法识别,因此程序失败(并调用
cmd.Help()
)。您已将
set
设置为命令和标志 (
--set
-s
),因此它会出现在您的
--help
输出中。我会考虑为命令参数使用不同的字符或在内部以其他方式添加它。