默认情况下,Cobra 子命令调用帮助



如果没有传递参数或标志,我希望 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的文档)。 它只不过是一个与RunEPreRunE具有完全相同符号的函数。

因此,在任何情况下检查参数和打印帮助的替代解决方案,请考虑

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
},
}

这样做的好处是清晰简洁,这与参数有关,而不是命令实现的"功能"。

相关内容

  • 没有找到相关文章

最新更新