[Cobra]Go语言的命令行编写工具的快速入门
Posted 梦想是能睡八小时的猪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Cobra]Go语言的命令行编写工具的快速入门相关的知识,希望对你有一定的参考价值。
1.什么是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
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语言的命令行编写工具的快速入门的主要内容,如果未能解决你的问题,请参考以下文章