cobra开源地址
https://github.com/spf13/cobra
cobra是什么
Cobra is a library for creating powerful modern CLI applications.
Cobra is used in many Go projects such as Kubernetes, Hugo, and GitHub CLI to name a few. This list contains a more extensive list of projects using Cobra.
cobra是用来创建先进现代化命令行工具的库。k8s/Hugo/Github Cli都是用cobra创建的。
cobra-cli
cobra-cli可以生成对应命令的代码,遵循cobra要求的代码风格和模式。如下的代码示例就是使用cobra-cli来进行的
基本概念
- Command:命令。通过命令告知程序应该做什么。
示例:
dockerps
dockerimages
dockerbuild-t tony/mes:v1 .
dockerrun-d -p 10000:1000 tony/mes:v1
ps/images/build/run均为命令 - Flag:参数值,字段值。有时候,想让程序干一件事情,光命令是不够的,还需要指定一些参数。这些参数叫做Flag。Flag属于某个命令或者根命令。
Flag是对命令的补充,不同的命令下可以有相同的Flag
示例:
docker build-t tony/mes:v1
docker run -d-p 10000:10000
docker run -d--port 10000:10000
docker-h
docker--help
hugo server--port=1313
flag通常是-或者--开头,有的有值,有的没有值,是对Command的补充。
上手代码
比如我想写一个API程序,名字叫cobratest,使用命令指定如下功能
- 启动配置(
serve)- 监听的ip(例如:
--ip=127.0.0.1) - 监听port(例如:
--port=2000或者-p=2000)
- 监听的ip(例如:
- 日志配置(
log)- 日志路径(例如:
--directory=c:/log或者-d=c:/log) - 日志级别(例如:
-l-evel=trace或者-l=trace)
- 日志路径(例如:
- 数据库配置(
db)- 数据库的类型(例如:
--type=mysql或者-t=mysql) - 连接字符串(例如:
--string=xxx或者-s=xxx)
程序启动起来大概是这样的命令
- 数据库的类型(例如:
cobratest serve --ip=0.0.0.0 --port 10000 log --directory=d:/log --level=info db --type=mysql --string=xxx
或者
cobratest serve --ip=0.0.0.0 -p 10000 log -d=d:/log -l=info db -t=mysql -s=xxx
上述有三个cobra中的命令:
- serve
- log
- db
开始撸码
新建一个cobratest文件夹,新建一个main.go文件
初始化go module:
go mod init cobratest
安装cobra-cli
go install github.com/spf13/cobra-cli@latest
确认安装是否,可以输入cobra-cli验证:

使用cobra-cli初始化go程序
cobra-cli init

初始化之后,可以看到自动创建了cmd文件夹,并增加了一些代码:

使用cobra-cli创建命令
如上,需要创建serve/log/db三个Command
cobra-cli add serve
cobra-cli add log
cobra-cli add db

此时可以看到cmd文件夹增加了三个文件:serve.go/log.go/db.go

定义接收参数的结构体
新建一个config文件夹,在config文件夹下新建一个config.go文件。文件内容如下:
package config
var Config AppConfig
type AppConfig struct {
ServeConfig ServeConfig
LogConfig LogConfig
DataBaseConfig DataBaseConfig
}
type ServeConfig struct {
IP string
Port int
}
type LogConfig struct {
Path string
Level string
}
type DataBaseConfig struct {
Type string
ConnnectionStr string
}
在各命令中接收Flag的值
rootCmd/logCmd/dbCmd/serveCmd都是cobra.Command类型,这个类型有许多方法。举例说明其中几个最重要的方法:
Bool:func (f *FlagSet) Bool(name string, value bool, usage string) *bool
BoolVar:func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string)
BoolP:func (f *FlagSet) BoolP(name, shorthand string, value bool, usage string) *bool
BoolVarP:func BoolVarP(p *bool, name, shorthand string, value bool, usage string)
其中:
- 返回
*bool的为Bool和BoolP方法,使用返回值接收Flag的值 BoolVar和BoolVarP传入Bool指针赋值到变量,区别是是否支持短名称(-)
开始写代码:
serve.go:



















