如果没有传递参数或标志,我希望 sub 命令打印出帮助菜单(默认情况下,主命令执行此操作)。
例如,没有任何参数或标志的主命令:
chris@pop-os:~$ ./tk
Command line application to deploy
Usage:
tk [command]
Available Commands:
addon Install packages
cluster Used to create cloud infrastructures
help Help about any command
Flags:
--config string config file (default is $HOME/.tk8.yaml)
-h, --help help for tk
-t, --toggle Help message for toggle
Use "tk [command] --help" for more information about a command.
如果没有输入参数或标志,我希望像"tk addon"这样的子命令也返回它自己的帮助菜单,目前它只给出一个空行。
插件代码 :
var addonCmd = &cobra.Command{
Use: "addon",
Short: "Install addon packages",
Long: `Install additional packages`,
Run: func(cmd *cobra.Command, args []string) {
}
},
}
可以检查传递给程序的参数数量。如果有更多参数,您将执行实际工作0
但如果更少,则只需显示命令的"帮助"。
var addonCmd = &cobra.Command{
Use: "addon",
Short: "Install addon packages",
Long: `Install additional packages`,
Run: func(cmd *cobra.Command, args []string) {
if len(args) == 0 {
cmd.Help()
os.Exit(0)
}
// do actual work
},
}
我认为最好在PreRunE上处理它。
var addonCmd = &cobra.Command{
Use: "addon",
Short: "Install addon packages",
Long: `Install additional packages`,
PreRunE: func(cmd *cobra.Command, args []string) error {
if len(args) == 0 {
cmd.Help()
os.Exit(0)
}
return nil
},
Run: func(cmd *cobra.Command, args []string) {
// do actual work
},
}
我是 Go 的新手,之所以能做到这一点,是因为如果没有提供参数,我也需要帮助来显示。 接受的答案是好的,这只是作为一种替代方案。
我的子命令只需要 2 个参数,所以我发现 Cobra 为此提供了一个很好的机制
var subCmd = &cobra.Command {
Use : "subc",
Args : cobra.ExactArgs(2),
...
}
问题是这不允许我打印帮助,即使有条件,如接受的答案中Run
讨论的那样。 因此,经过进一步挖掘,我发现Command
结构中Args
的定义与*RunE
字段相同(请参阅PositionalArgs的文档)。 它只不过是一个与RunE
或PreRunE
具有完全相同符号的函数。
因此,在任何情况下检查参数和打印帮助的替代解决方案,请考虑
var subCmd = &cobra.Command {
...
Args : func (cmd *cobra.Command, args []string) error {
if len(args) == 0 {
cmd.Help()
os.Exit(0)
} else if len(args) < 2 {
fmt.Println("Incorrect number of args. <arg1> <arg2> are required")
os.Exit(1)
}
// as written, the command ignores anything more than 2
return nil
},
}
这样做的好处是清晰简洁,这与参数有关,而不是命令实现的"功能"。