Как сделать подкоманду обязательной в Go CLI, используя кобру
Я использую Cobra для обновления своего приложения. Я хочу сделать эту команду обязательной, то есть приложение должно завершиться сбоем, если оно не находит аргумент, который ищет.
package commands
import (
"github.com/spf13/cobra"
"errors"
"fmt"
)
var (
Env string
)
var RootCmd = &cobra.Command{
Use: "myapp",
Short: "tool",
Long: `tool`,
Run: func(cmd *cobra.Command, args []string) {
// Root command does nothing
},
}
func init() {
RootCmd.AddCommand(Environment)
}
var Environment = &cobra.Command{
Use: "env",
Short: "Specify Environment to run against",
Long: `Can be dev or prod`,
Args: func(cmd *cobra.Command, args []string) error {
if len(args) != 1 {
return errors.New("requires at least one arg")
}
if args[0] == "dev" || args[0] == "prod" {
return nil
}else {
return errors.New("input can only be dev or prod")
}
return fmt.Errorf("invalid env specified: %s", args[0])
},
PreRunE: func(cmd *cobra.Command, args []string) error {
if len(args) != 1 {
return fmt.Errorf("env is required")
}
return nil
},
Run: func(cmd *cobra.Command, args []string) {
Env = args[0]
},
}
и основной пакет
package main
import (
"fmt"
"log"
"os"
"util"
"commands"
)
func main() {
log.Println("Executing")
if err := commands.RootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
log.Println("Executing")
}
Теперь, если я запускаю это как./myApp без env, он не будет жаловаться на это. Однако, если я использую env после myapp, он активирует функцию и запускает все проверки.
1 ответ
Опуская
Run
(и
RunE
) из поля
cobra.Command
сделает обязательным наличие действительной подкоманды:
var RootCmd = &cobra.Command{
Use: "myapp",
Short: "tool",
Long: `tool long help...`,
}
Если в командной строке не указана подкоманда, Cobra распечатает команду
Help()
текст, который будет включать корневую команду
Long
текст справки и автоматически созданная справка по использованию для всех подкоманд.
Вы можете просто заставить тело функции обрабатывать его, возможно, распечатав справку и завершив работу как неуспешную:
Run: func(cmd *cobra.Command, args []string) {
// Root command does nothing
cmd.Help()
os.Exit(1)
},