cobra框架初探

2022-08-15 14:58:52 浏览数 (1)

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是个什么东东,进行了初步学习。

0 人点赞