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
: