Cobra 子命令默认调用帮助
Cobra Subcommand Invoke Help By Default
如果没有传递参数或标志,我希望子命令打印出帮助菜单(主命令默认执行此操作)。
例如,没有任何参数或标志的主命令:
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" 这样的子命令也 return 如果没有输入参数或标志,它有自己的帮助菜单,目前它只给出一个空行。
插件代码:
var addonCmd = &cobra.Command{
Use: "addon",
Short: "Install addon packages",
Long: `Install additional packages`,
Run: func(cmd *cobra.Command, args []string) {
}
},
}
可以检查传递给程序的参数数量。如果有更多的 0
args 你会做实际的工作,但如果它少于那么你只会显示命令的 "help" 。
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
字段(see docs for 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
},
}
这样做的好处是简洁明了,因为这与参数有关,而不是命令实现的“功能”。
如果没有传递参数或标志,我希望子命令打印出帮助菜单(主命令默认执行此操作)。
例如,没有任何参数或标志的主命令:
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" 这样的子命令也 return 如果没有输入参数或标志,它有自己的帮助菜单,目前它只给出一个空行。
插件代码:
var addonCmd = &cobra.Command{
Use: "addon",
Short: "Install addon packages",
Long: `Install additional packages`,
Run: func(cmd *cobra.Command, args []string) {
}
},
}
可以检查传递给程序的参数数量。如果有更多的 0
args 你会做实际的工作,但如果它少于那么你只会显示命令的 "help" 。
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
字段(see docs for 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
},
}
这样做的好处是简洁明了,因为这与参数有关,而不是命令实现的“功能”。