我正在使用 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")
}
现在,如果我在没有任何 env 的情况下将其作为 ./myApp 运行,它不会抱怨它。但是,如果我在myapp之后使用env,那么它会激活该功能并运行所有验证。
从cobra.Command
中省略Run
(和RunE
(字段将需要给出有效的子命令:
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)
},