我正在使用Cobra将一些cli更新到我的应用。我想要使这个命令成为必需,这意味着如果应用程序找不到它正在查找的参数,应该会失败。
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运行,它就不会抱怨它。但是,如果我在myapp之后使用env,那么它会激活该函数并运行所有验证。
答案 0 :(得分:0)
你可以让函数的主体处理它,可能是printing help和exiting as non-successful:
Run: func(cmd *cobra.Command, args []string) {
// Root command does nothing
cmd.Help()
os.Exit(1)
},
答案 1 :(得分:0)
从Run
省略RunE
(和cobra.Command
)字段将要求给出有效的子命令:
var RootCmd = &cobra.Command{
Use: "myapp",
Short: "tool",
Long: `tool long help...`,
}
如果在命令行上没有给出子命令,则Cobra将打印出命令的Help()
文本,其中将包括根命令的Long
帮助文本以及所有子命令的自动生成的使用帮助。