Подкоманда Cobra вызывает справку по умолчанию

Я хочу, чтобы подкоманда выводила меню справки, если не передан аргумент или флаги (основная команда делает это по умолчанию).

Например, основная команда без каких-либо аргументов или флагов:

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

        }
    },
}

3 ответа

Решение

Это можно сделать с проверкой количества передаваемых аргументов в вашу программу. Если есть больше, то 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
    },
}

Я думаю, что лучше разобраться с этим на 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в принятом ответе . Итак, после дальнейших раскопок я обнаружил, что определение 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
    },
}

Преимущество этого в том, что оно ясно и лаконично, поскольку относится к аргументам, а не к «функциональности», реализованной командой.

Другие вопросы по тегам