Cobra 子命令默认调用帮助

问题描述 投票:0回答:3

如果没有传递参数或标志,我希望子命令打印出帮助菜单(主命令默认执行此操作)。

例如,不带任何参数或标志的主命令:

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) {

        }
    },
}
go go-cobra
3个回答
41
投票

可以检查传递给程序的参数数量。如果参数多于

0
args,您将执行实际工作,但如果少则您将仅显示命令的“帮助”。

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

3
投票

我认为最好在 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
    },
}

1
投票

我对 Go 完全陌生,之所以得出这个结论是因为我也需要在不提供参数的情况下显示帮助。接受的答案很好,这只是作为替代方案。

我的子命令正好需要 2 个参数,所以我发现 Cobra 为此提供了一个很好的机制

var subCmd = &cobra.Command {
    Use : "subc",
    Args : cobra.ExactArgs(2),
    ...
}

问题是这不允许我打印帮助即使有条件,如已接受的答案

中的
Run中所讨论的那样。因此,经过进一步挖掘,我发现
Args
结构中
Command
的定义与
*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
    },
}

这样做的好处是清晰简洁,这涉及参数而不是命令实现的“功能”。

© www.soinside.com 2019 - 2024. All rights reserved.