cobra

141 阅读1分钟

Cobra 既是一个可以创建强大的现代 CLI 应用程序的库,也是一个可以生成应用和命令文件的程序。 用此库创建的命令行程序无法进行ui化,使用任何ui库运行都会报错。

库地址 github.com/spf13/cobra

1目录结构

推荐目录结构

xxx/cmd
    root.go
    app1.go
    app2.go
main.go

2命令主体

rootcmd := &cobra.Command{
    Use: "",
    Short: "", //简短描述
    Long:"", //详情
    Run: func(cmd *cobra.Command, args []string) {},
}

注意一个命令主体必须有Run或者子命令,否则运行不正常。

3 添加子命令

app1cmd := &cobra.Command{
    Use:"app []", //除了命令外后边可以跟.. [] {} | 解释该命令的参数
    Short:"",
    Long:"",
    Run: func(cmd *cobra.Command, args []string) {}
}

rootcmd.AddCommand(app1cmd) //添加子命令

4 参数绑定

rootcmd.Flags().StringVar(&RootConfig.Host, "host", "localhost", "数据库地址")
rootcmd.Flags().StringVarP(&RootConfig.Password, "password", "p", "localhost", "数据库密码")

主要是这两种绑定函数,Flags().xxxVar() 不带短参数 Flags().xxxVarP() 带短参数

5 参数校验

利用 "gopkg.in/dealancer/validate.v2" 库对参数进行校验。

type AppConfig struct {
	Host     string `validate:"empty=false"`
	Port     string `validate:"empty=false"`
	User     string `validate:"empty=false"`
	Password string `validate:"empty=false"`
	DbName   string `validate:"empty=false"`
}

var RootConfig = &AppConfig{}

func main() {
	cmd := &cobra.Command{Use: "gs",
		Short: "short info",
		Long:  "Long info",
		Run: func(cmd *cobra.Command, args []string) {
			fmt.Println(RootConfig)
			fmt.Println(cmd.UsageString())
		}}

	cmd.Flags().StringVar(&RootConfig.Host, "host", "localhost", "数据库地址")
	cmd.Flags().StringVar(&RootConfig.Port, "port", "3306", "数据库端口")
	cmd.Flags().StringVar(&RootConfig.User, "user", "", "数据库账号")
	cmd.Flags().StringVarP(&RootConfig.Password, "password", "p", "localhost", "数据库密码")
	cmd.Flags().StringVar(&RootConfig.DbName, "dbname", "", "数据库名称")
	cobra.OnInitialize(func() {
                //此处对参数进行校验
		if err := validate.Validate(RootConfig); err != nil {
			fmt.Println(err)
			os.Exit(1)
		}
	})


	cmd.Execute()
}