Cobra既是用于创建强大的现代CLI应用程序的库,也是用于生成应用程序和命令文件的程序。
Cobra是一个库,提供了一个简单的界面来创建类似于git&go工具的强大的现代CLI界面。
Cobra也是一个应用程序,它将生成您的应用程序支架,以快速开发基于Cobra的应用程序。
Cobra提供:
Cobra建立在命令,参数和标志的结构上。
COMMAND代表动作,Args代表事物,Flags是这些动作的修饰符。
要遵循的模式是 APPNAME VERB NOUN --ADJECTIVE. 或 APPNAME COMMAND ARG --FLAG
安装
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")