Подкоманда 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
},
}
Преимущество этого в том, что оно ясно и лаконично, поскольку относится к аргументам, а не к «функциональности», реализованной командой.