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()
}