一、基本概念
cobra-cli 库是 golang 的一个开源第三方库,能够快速便捷的建立命令行应用程序。
优势:cobra-cli 可以快速建立CLI程序,使我们更专注于命令需要处理的具体的业务逻辑。
cobra-cli由三部分构成:commands,arguments 和 flags
commands:表示要执行的动作。每一个 command 表示应用程序的一个动作。每个命令可以包含子命令。
arguments:给动作传入的参数。
flags:表示动作的行为。可以设置执行动作的行为。flags 包括两种:对某个命令生效和对所有命令生效。
二、安装方法
go install github.com/spf13/cobra-cli@latest
三、使用方法
1.创建项目文件夹,比如在$GOPATH/src下面创建cobraCliDemo项目文件夹
2.在项目文件夹里面执行 go mod init <MODNAME>,比如go mod init cobraCliDemo
3.执行cobra-cli init
创建成功后项目目录如下:
![](https://img.haomeiwen.com/i11520018/a8e5496f4007b08e.png)
3.1、root.go代码如下:
![](https://img.haomeiwen.com/i11520018/389c505fc7f93cfc.png)
root.go代码中有一个rootCmd变量:
Use: 命令。
Short: 命令的简短描述。
Long: 命令的详细描述,在帮助命令,如[appName] -h或者[appName] [command] -h时会显示此程序和此命令的字符串。
Run: 命令执行入口,函数主要写在这个模块中。
3.2、main.go代码如下:
![](https://img.haomeiwen.com/i11520018/306767c044c995b0.png)
4、运行go build main.go,然后执行./main
![](https://img.haomeiwen.com/i11520018/7199fad6d7b36e7a.png)
四、给项目添加命令
1、项目添加命令
比如在项目目录下面即main.go目录下面执行下面命令
(1)、cobra-cli add serve:创建server命令
(2)、cobra-cli add config:创建config命令
(3)、cobra-cli add create -p 'configCmd':在configCmd命令下面创建create子命令create,即嵌套命令创建方式 cobra-ci add 子命令名字 -p "父命令Cmd"
代码如下:
![](https://img.haomeiwen.com/i11520018/48250eb7de962918.png)
![](https://img.haomeiwen.com/i11520018/aa2f73b4eb11d8a4.png)
![](https://img.haomeiwen.com/i11520018/c57be26d999d1e5d.png)
(4) 编译执行:go build main.go,然后执行./main
![](https://img.haomeiwen.com/i11520018/75650acb9d29543d.png)
config,serve为我们刚才创建的命令,执行./main serve,./main config进行调用
2、为command(命令)添加选项(flags)
flags用来控制命令的具体行为分为本地(local) flags和全局(persistent) flags两类。
(1)全局选项persistent flags
对于 persistent 类型的选项,既可以设置给该 Command,又可以设置给该 Command 的子 Command。
a、使用PersistentFlags().String添加flags
在root.go定义一个全局变量var foo *string,然后在root.go的init里面添加:
foo =rootCmd.PersistentFlags().String("foo","defaultFo","A help for foo")
执行go run main.go serve --foo fo,fo被赋值给foo;如果go run main.go serve,默认的defaultFo被赋值给foo,由此可见在父命令rootCmd定义的--foo全局flags在子命令serve里面也可以用,同理在子命令config和create里也可用,调用方式:go run main.go config --foo f,go run main.go config create --foo f。
b、使用PersistentFlags().StringVar添加flags
在root.go定义一个全局变量var print string,然后在root.go的init里面添加:
rootCmd.PersistentFlags().StringVar(&print,"print","defaultPrint","print")
执行go run main.go serve --foo fo --print p,fo被赋值给foo,p被赋值给print;如果go run main.go serve,默认的defaultFo被赋值给foo,defaultPrint赋值给print,由此可见在父命令rootCmd定义的--print全局flags在子命令serve里面也可以用,同理在子命令config和create里也可用,调用方式:go run main.go config --foo fo --print p,go run main.go config create --foo fo --print p。
c、PersistentFlags().BoolVarP添加flags
在root.go定义一个全局变量var show string,然后在root.go的init里面添加:
// 下面定义了一个Flag show,show默认为false, 有两种调用方式--show\-w,命令后面接了show则上面定义的show变量就会变成true
rootCmd.PersistentFlags().BoolVarP(&show,"show","w",false,"show")
执行go run main.go serve --foo fo --print p -w,fo被赋值给foo,p被赋值给print,show为true;如果go run main.go serve,默认的defaultFo被赋值给foo,defaultPrint赋值给print,show为false,由此可见在父命令rootCmd定义的--w/--show全局flags在子命令serve里面也可以用,同理在子命令config和create里也可用,调用方式:go run main.go config --foo fo --print p -w ,go run main.go config create --foo fo --print p -w。
运行go run main.go serve -h可以看到命令flags使用方式。
![](https://img.haomeiwen.com/i11520018/42aac8955e5a3860.png)
(2)本地选项local flags
local 类型的选项只能设置给指定的 Command。
同理在serve.go的init添加下面代码设置本地flags。
foo2 =serveCmd.Flags().String("foo2","fo2","help for foo2")
serveCmd.PersistentFlags().StringVar(&print2,"print2","defaultPrint2","print2")
serveCmd.Flags().BoolP("serve","s",false,"Help message for serve")
执行go run main.go serve -h可以看到flags的使用方式:
![](https://img.haomeiwen.com/i11520018/3d2b8aeb752a3e27.png)
执行go run main.go serve -s或go run main.go serve --serve,serve命令被调用,输出:
serve called foo: rr
serve called print: defaultPrint
serve called show: false
serve called foo2: fo2
serve.go serveCmd代码如下:
![](https://img.haomeiwen.com/i11520018/eb615faf221f2ecb.png)
3、获取命令行参数
MinimumNArgs(int) 当参数数目低于配置的最小参数个数时报错
MaximumNArgs(int) 当参数数目大于配置的最大参数个数时报错
ExactArgs(int) 如果参数数目不是配置的参数个数时报错
NoArgs 没有参数则报错
执行cobra-cli add path添加path命令 ,设置该命令需要且仅需要一个参数,并在Run方法中取出参数 ,代码如下:
![](https://img.haomeiwen.com/i11520018/6a9a0696218efe96.png)
然后执行go run main.go path /bin,输出/bin
代码下载:git@github.com:steven2008/go-cobra-cli.git
网友评论