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)相同。它只不过是一个与 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
    },
}

这样做的好处是简洁明了,因为这与参数有关,而不是命令实现的“功能”。