[Cobra]Go语言的命令行编写工具的快速入门

Posted 梦想是能睡八小时的猪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Cobra]Go语言的命令行编写工具的快速入门相关的知识,希望对你有一定的参考价值。

1.什么是Cobra

    cobra是一个用于创建强大现代CLI应用程序的库,也是一个生成应用程序和命令文件的程序。他可以实现对于命令行的使用和编写。cobra被用在很多go语言的项目中,比如 Kubernetes(K8S)、Docker、Istio、ETCD、Hugo、Github CLI等等。
cobra提供
  • 简单的基于子命令的命令行:app server、app fetch 等等
  • 完全符合POSIX的标志(包含短版本和长版本)
  • 嵌套子命令
  • 全局、本地和级联的标志
  • 使用 cobra init appname和cobra add cmdname 可以很容易生成应用程序和命令
  • 智能提示(app srver... did you mean app server?)
  • 自动生成命令和标志
  • 自动识别 -h --help 等等为help标志
  • 为应用程序自动shell补全(bash、zsh、fish、powershell)
  • 为应用程序自动生成手册
  • 命令别名
  • 灵活定义帮助、用法等等
  • 可选的与viper的紧密集成

2.cobra的基本概念

    Cobra 结构由三部分组成:命令 (commands)、参数 (arguments)、标志 (flags)。commands代表命令动作,args是事物对象,flags是动作的修饰符。

如下的例子,server 是command,port是flag

hugo server --port=1313

  这个命令中,我们告诉git 克隆url

git clone URL --bare

  cobra认为,一个好的命令要如同一个句子一样符合语法以及直观。

3.cobra的安装和配置

  我们只需要

go get -u github.com/spf13/cobra

   就可以安装cobra这个库。接下来新建一个项目clia,在main.go中引入这个库。

import "github.com/spf13/cobra"

   使用go mod tidy同步mod。

  我们使用命令自动初始化cobra这个项目。后面的--pkg-name是必填项,为项目命名。

  初始化完毕后,项目自动生成如下结构,包括一个根命令和在init的时候自定义的许可信息等。

这个结构符合cobra的标准结构规范。

4.cobra的基本使用

4.1 命令参数

4.1.1 根命令参数

  初始生成的根命令如上图所示,命令会以一个变量的形式定义,如上图的根命令的名字是rootCmd,他给我们定义了use(调用command),short(短帮助信息),long(长帮助信息)等参数。我们可以go build clia,然后输入.\\clia命令查看效果。

会返回Long 长帮助信息。

4.1.2 子命令参数

  我们给出一个子命令的情况。

var testCmd = &cobra.Command{
	Use:   "test",
	Short: "短帮助信息",
	Long: `长帮助信息`,
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("test called")
	},
}

func init() {
	versionCmd.AddCommand(testCmd)
}

  可以看到,比之根命令,子命令多了一个run函数,他接受2个参数,第一个是命令参数,第二个是一个字符串数组。第一个参数传入的是这个变量的整体信息,第二个传入的是从命令行接受的数据。

  我们对第二个参数进行测试,我们使用test子命令,在run函数作如下定义:

var testCmd = &cobra.Command{
	Use:   "test",
	Short: "短帮助信息",
	Long: `长帮助信息`,
	Run: func(cmd *cobra.Command, args []string) {
		res:=0
		for _,v := range args{
			temp,err := strconv.Atoi(v)
			if err !=nil{
				fmt.Println(err)
			}else{
				res +=temp
			}
		}
		fmt.Println(res)
	},
}

  实际是把输入的字符串转为整型,进行累加返回总和,调用测试

4.2 添加子命令

  我们可以通过指令cobra add [name]来让cobra帮我们自动生成一个子命令

  比如我们生成一个查看版本的子命令

cobra add version

  会在cmd文件夹下生成一个version.go,我们修改其配置

  重新build后,输入.\\clia

可以看到多了一个命令,version 短帮助信息为"版本信息"

  我们输入命令 ./clia version

可以看到定义的上面run函数调用函数fmt.println()的结果。

4.3 将子命令绑定到父命令

  在上文创建子命令的时候,我们会看到cobra会帮我们实现绑定的功能,

  可以看见init函数中的AddCommand()函数帮我们实现了将versionCmd变量绑定到rootCmd变量的功能。

  我们可以为version子命令再绑定一个子命令 我们添加test子命令

修改test.go中的init函数,,为versionCmd变量添加子命令。

进行测试,可以发现实现了version的子命令。

4.4 使用Flags为命令添加一个选项

  标志提供修饰符来控制操作命令的操作方式,我们为version定义一个flag。

  在version.go中我们在init函数中定义一个flag,添加一个获取String类型的选项。也可以获取布尔,整型,ip地址等类型的数据。

versionCmd.Flags().StringP("author","a","测试一号","帮助信息:作者名称")

  第一个参数是flag的名字,第二个参数是其简称,可以通过-author使用,也可以通过-a使用,第三个是默认的选项信息,第四个是帮助信息

  我们修改verisionCmd的代码

var versionCmd = &cobra.Command{
	Use:   "version",
	Short: "版本信息",
	Long: `这是关于版本的长的帮助信息`,
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("version-0.0.1")
		author,err:=cmd.Flags().GetString("author")
		if err !=nil{
			fmt.Println("请输入正确的作者信息")
			return
		}
		fmt.Println("作者是:",author)
	},
}

   使得输出版本信息的时候会默认输出一个作者的信息,这个作者的信息默认是测试一号,我们可以通过flag进行修改

  默认情况

 

  通过flag修改

  标志可以使用持久化定义,让他在全局调用

  需要在外部var声明这个变量,传入这个变量的地址。

rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose output")

  这里就获取了一个布尔型的值,赋值给Verbose,名字是verbose,指令是v,默认false,帮助信息是verbose output。

  可以把flag设置为必填项

rootCmd.MarkFlagRequired("verbose")

 

cobra官方文档参考:https://github.com/spf13/cobra

以上是关于[Cobra]Go语言的命令行编写工具的快速入门的主要内容,如果未能解决你的问题,请参考以下文章

go Cobra命令行工具总结

Go语言---小白入门-命令行库Cobra的使用

Go语言命令行利器cobra使用教程

使用Go语言在MacOS创建一个自定义的命令行工具

#导入MD文档图片#Cobra + Client-go实现K8s 自定义插件开发

go 库 Cobra 现代化的命令行框架