如何使用眼镜蛇在Go CLI中使子命令成为必需的



我正在使用 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)
},

相关内容

  • 没有找到相关文章

最新更新