cobra简介
cobra是一个命令行程序库,可以用来编写命令行程序,非常简单易用,类似于Go标准库中的Flag包,不过它比Flag包强大很多。它提供了一个脚手架,可以生成基于cobra的应用程序框架。
cobra的github地址是https://github.com/spf13/cobra,可以看到很多知名的项目Kubernetes/Docker/Hugo/Etcd都在使用。
cobra的作者是spf13,它是Google工程师,也是Go项目团队成员,它写的很多项目都有过万⭐️,非常受欢迎,例如hugo静态博客生成器。
cobra安装
cobra安装非常简单,与我们安装其他第三方库是一样的。执行下面的命令即可。
代码语言:javascript复制go get -u github.com/spf13/cobra/cobra
然后检查下是否安装成功,执行下面的命令,输出说明信息说明已安装成功。如果没有正确输出,检查是否已将cobra加入到环境变量PATH中。
代码语言:javascript复制cobra -h
cobra使用
初始化项目
我们通过写一个demo项目学习cobra使用。在工作目录下,新建一个cobraDemo文件夹,然后执行go mod init cobraDemo操作。在当前的文件夹下生成了mod文件。
然后使用cobra提供的init命令初始化项目,会自动帮我们生成一些文件,如下图所示,自动生成了main.go文件和cmd文件夹, cmd文件夹下有一个root.go文件。
代码语言:javascript复制cobra init --pkg-name cobraDemo --author YongMing
这里简单说下上述命令参数的含义,pkg-name用于指定工程命令,可以在当前目录,也可以在相对目录生成目录名称。author指定作者信息,可以看到在生成的代码文件开头携带了作者信息。
编译运行
在前面已创建了项目,现在进行编译运行。在cobraDemo文件下执行go build命令,在当前的文件夹下生成了可执行文件cobraDemo。
然后运行它./cobraDemo.
添加命令
下面为我们的cobraDemo添加一个test命令,操作如下,此时在cmd文件夹下生成一个test.go文件。
代码语言:javascript复制cobra add test
重新编译项目,运行cobraDemo,得到如下输出。可以输入命令多了一个test功能。
执行 ./cobraDemo test 会输出test called.
命令结构
cobra结构由命令 (commands)、参数 (arguments)、标志 (flags)三部分组成.下面看它的代码是怎么组织的。
代码语言:javascript复制// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
Use: "cobraDemo",
Short: "A brief description of your application",
Long: `A longer description that spans multiple lines and likely contains
examples and usage of using your application. 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.`,
// Uncomment the following line if your bare application
// has an action associated with it:
// Run: func(cmd *cobra.Command, args []string) { },
}
上面的程序片段来自cmd文件夹下的root.go文件。cobra中命令封装成了一个cobra.Command结构。该结构主要包含执行的命令以及动作。命令对应到Command中的Use内容,执行的动作就是Command中的Run函数。
root.go是顶级命令对象,像./cobraDemo test命令,test是属于cobraDemo下的子命令,形成了一个嵌套结构。对应到下面的代码就是testCmd对象添加在rootCmd对象下,rootCmd.AddCommand(testCmd)。
代码语言:javascript复制var testCmd = &cobra.Command{
Use: "test",
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("test called")
},
}
func init() {
rootCmd.AddCommand(testCmd)
}
命令参数
前面分析了cobra的命令结构,这里在说下命令参数的使用。在test.go文件init函数中添加下面的代码
代码语言:javascript复制testCmd.Flags().StringP("author","a","YongMing","author info")
testCmd.Flags().StringP("version","v","v0.0.1","version info")
修改testCmd的Run方法为
代码语言:javascript复制Run: func(cmd *cobra.Command, args []string) {
fmt.Println("test called")
author,err:=cmd.Flags().GetString("author")
if err!=nil{
fmt.Println("get author info fail.")
}
fmt.Println("作者信息: ",author)
version,err:=cmd.Flags().GetString("version")
if err!=nil{
fmt.Println("get version info fail.")
}
fmt.Println("版本信息: ",version)
},
重新编译运行,这时可以看到输出有作者和版本信息
我们也可以通过参数Flags设置作者和版本信息
总结
本文我们学习了cobra的基本使用以及代码组织结构,这为我们学习其他项目能够有所帮助,小编学习cobra原因是在看etcd源码的时候,它里面的etcdctl包基本都是用cobra包结合client包实现的,所以好奇cobra是个什么东东,进行了初步学习。