什么是cobra?
Cobra既是用于创建强大的现代CLI应用程序的库,也是用于生成应用程序和命令文件的程序。
-
Cobra是一个库,提供了一个简单的界面来创建类似于git&go工具的强大的现代CLI界面。
-
Cobra也是一个应用程序,它将生成您的应用程序支架,以快速开发基于Cobra的应用程序。
Cobra提供:
- 简单易用的基于子-的CLI: ,app server,app fetch等。
- 完全符合POSIX标准(包括短版和长版)
- 嵌套的子命令
- 全局,本地和级联标志
- 易产生的应用程序和命令与cobra init appname&cobra add cmdname
- 智能建议(app srver…你的意思是app server?)
- 命令和标志的自动帮助生成
- 自动帮助标志识别-h,–help等等。
- 为您的应用程序自动生成bash自动完成
- 为您的应用程序自动生成的手册页
- 命令别名,以便您可以在不破坏它们的情况下进行更改
- 定义您自己的帮助,用法等的灵活性。
- 可选择与viper紧密集成,适用于12因素应用
Cobra建立在命令,参数和标志的结构上。
COMMAND代表动作,Args代表事物,Flags是这些动作的修饰符。
要遵循的模式是 APPNAME VERB NOUN --ADJECTIVE. 或 APPNAME COMMAND ARG --FLAG
如何使用cobra?
-
安装
go get -u github.com/spf13/cobra/cobra or 在 github.com 目录下执行以下操作 git clone https://github.com/spf13/cobra.git
-
初始化项目
# 在gopath路径下的src目录下执行 cobra init ‘项目名称(这里假设为test)’ # 该操作会在src目录下创建test目录 ▾ test/ ▾ cmd/ root.go main.go
-
添加命令
cobra add 命令(这里假设是version) # 这时cmd文件夹下会生成一个新的文件version.go,在这个文件中定义这个新的命令的动作。
version.go内容如下:
import ( "fmt" "github.com/spf13/cobra" ) // versionCmd represents the version command var versionCmd = &cobra.Command{ Use: "version", ## 命令名称 Short: "A brief description of your command", ## 命令的简短介绍 Long: `A longer description that spans multiple lines and likely contains ## 命令详细介绍,可以写出命令的使用例子。 examples and usage of using your command. For example: Cobra is a CLI library for Go that empowers applications. This application is a tool to generate the needed files to quickly create a Cobra application.`, ## 使用本命令需要执行的代码写在这里 Run: func(cmd *cobra.Command, args []string) { fmt.Println("version called") ## 这里表示执行test.exe version后执行的代码 }, } func init() { rootCmd.AddCommand(versionCmd) ## 表示为root添加子命令version // Here you will define your flags and configuration settings. // Cobra supports Persistent Flags which will work for this command // and all subcommands, e.g.: // versionCmd.PersistentFlags().String("foo", "", "A help for foo") // Cobra supports local flags which will only run when this command // is called directly, e.g.: // versionCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") }
此时执行以下代码
> go build -o test > test -h Usage: test [command] Available Commands: help Help about any command version A brief description of your command Flags: --config string config file (default is $HOME/.demo.yaml) -h, --help help for demo 执行新添加的命令 >test version 输出:version called
-
添加flag
# 在version.go文件的init函数中添加局部flag func init() { rootCmd.AddCommand(versionCmd) # 添加flag(bool类型) versionCmd.Flags().BoolP("isok", "p", false, "flag is ok?") }
执行命令,则:
>test version -h Usage: test version [flags] Flags: -h, --help help for version -p, --isok flag is ok? Global Flags: --config string config file (default is $HOME/.demo.yaml)
-
flag赋值
-
使用全局flag
让一个flag对所有命令生效,需要在root.go文件中创建一个变量存储flag值。# 1.在root.go 文件中添加一个变量name var name string # 2.在init函数中添加全局flag,将flag值存储到变量name中 rootCmd.PersistentFlags().StringVar(&name, "name", "x", "set name") # 3.在子命令version的Run方法中输出name Run: func(cmd *cobra.Command, args []string) { fmt.Println("name is: ", name) } # 4.执行命令 test version --name wfl or test version -x wfl 输出: name is: wfl
-
使用局部flag
让一个flag对某个命令生效,需要在该命令文件中创建一个变量存储flag值。# 1.定义变量sunsine var sunshine string # 2.在version.go的init函数中添加flag versionCmd.Flags().StringVarP(&sunshine, "sunshine", "s", false, "you are my sunshine") # 3.在子命令version.go的Run方法中输出 Run: func(cmd *cobra.Command, args []string) { fmt.Println("name is: ", name) fmt.Println("sunshine is: ", sunshine) } # 4.执行命令 test version --name wfl --sunshine wfl 输出: name is: wfl sunshine is: wfl
-
必填flag
默认情况下,flag是optional(选填),若flag为必填,则需要做如下设置
如将version命令下的sunshine flag设置为必填# 1.init文件中增加flag定义 versionCmd.Flags().StringVarP(&sunshine, "sunshine", "s", "", "you are my sunshine") versionCmd.MarkFlagRequired("sunshine")
-