其他分享
首页 > 其他分享> > [Cobra]Go语言的命令行编写工具的快速入门

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

作者:互联网

1.什么是Cobra

    cobra是一个用于创建强大现代CLI应用程序的库,也是一个生成应用程序和命令文件的程序。他可以实现对于命令行的使用和编写。cobra被用在很多go语言的项目中,比如 Kubernetes(K8S)、Docker、Istio、ETCD、Hugo、Github CLI等等。 cobra提供

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,入门,fmt,cobra,信息,命令,version,go,Go
来源: https://www.cnblogs.com/End1ess/p/15578014.html