无法在 Cobra 参数中插入破折号
Cannot insert dash in cobra parameters
我找了一些类似的问题,但除此之外找不到任何问题:https://github.com/spf13/cobra/issues/1025
我的问题是插入一些开头包含破折号的字符串,如下例所示,
go run myapp exampleCmd set "-Dexample"
Cobra 似乎将输入 -Dexample 作为内部参数,因为 returns 这个输出:
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 开头的破折号参数?
使用此解决方法解决(如果是)
我在 &cobra.Command{} 的末尾添加了这个元素:
DisableFlagParsing: true,
我认为在使用像 cobra
这样的实用程序时,不可能传递以 dash
符号开头的参数。 dash
是一个标志指示符,它是否包含在引号中并不重要,单个 dash
被读取为 shorthand 标志,因此您输入的第一个字母正在被解释作为标志且无法识别,因此程序失败(并调用 cmd.Help()
)。
您已将 set
设置为命令和标志 (--set
-s
),因此它会出现在您的 --help
输出中。
我会考虑为您的命令参数使用不同的字符,或者在内部以其他方式添加它。
与虚拟所有 Unix 风格的命令行实用程序和标志解析库一样,Cobra 使用 --
将标志与参数分开,之后不再有参数将被解析为标志,即使它们以-
.
go run myapp exampleCmd set -- "-Dexample"
这与您与其他 CLI 实用程序的交互方式没有什么不同。例如,rm -i
设置 interactive
标志,而 rm -- -i
删除名为 -i
.
的文件
您确实不想任意禁用某些不一致的命令或子命令的标志(在您自己的应用程序中和所有其他应用程序中),不必要的,并且破坏了基本用户期望:有时,-h
会执行用户期望的操作,但对于某些命令,由于用户无法预料的原因,-h
将被视为参数并产生意外行为。
Unix 已经解决这个问题 50 多年了。让用户通过 --
.
决定一个参数是否是一个标志
我找了一些类似的问题,但除此之外找不到任何问题:https://github.com/spf13/cobra/issues/1025
我的问题是插入一些开头包含破折号的字符串,如下例所示,
go run myapp exampleCmd set "-Dexample"
Cobra 似乎将输入 -Dexample 作为内部参数,因为 returns 这个输出:
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 开头的破折号参数?
使用此解决方法解决(如果是)
我在 &cobra.Command{} 的末尾添加了这个元素:
DisableFlagParsing: true,
我认为在使用像 cobra
这样的实用程序时,不可能传递以 dash
符号开头的参数。 dash
是一个标志指示符,它是否包含在引号中并不重要,单个 dash
被读取为 shorthand 标志,因此您输入的第一个字母正在被解释作为标志且无法识别,因此程序失败(并调用 cmd.Help()
)。
您已将 set
设置为命令和标志 (--set
-s
),因此它会出现在您的 --help
输出中。
我会考虑为您的命令参数使用不同的字符,或者在内部以其他方式添加它。
与虚拟所有 Unix 风格的命令行实用程序和标志解析库一样,Cobra 使用 --
将标志与参数分开,之后不再有参数将被解析为标志,即使它们以-
.
go run myapp exampleCmd set -- "-Dexample"
这与您与其他 CLI 实用程序的交互方式没有什么不同。例如,rm -i
设置 interactive
标志,而 rm -- -i
删除名为 -i
.
您确实不想任意禁用某些不一致的命令或子命令的标志(在您自己的应用程序中和所有其他应用程序中),不必要的,并且破坏了基本用户期望:有时,-h
会执行用户期望的操作,但对于某些命令,由于用户无法预料的原因,-h
将被视为参数并产生意外行为。
Unix 已经解决这个问题 50 多年了。让用户通过 --
.