Cobra 是用 go 语言实现的用于创建 CLI 应用程序和命令文件的工具。
许多 Go 的项目都是使用 Cobra 构建的,包括:
kubernetes
etcd
hugo
docker
……
本篇就来讲解一下 cobra 的使用,也为后续学习 kubernetes 做铺垫。
Cobra安装与初始化
首先新建一个目录,在目录中进行 go mod 初始化
go mod init cobra-demo
安装 cobra-cli (我使用的 go 版本是 1.18)
go install github.com/spf13/cobra-cli@latest
如果 go install 下载缓慢,可以进行如下修改进行加速
$ echo "export GO111MODULE=on" >> ~/.profile
$ echo "export GOPROXY=https://goproxy.cn" >> ~/.profile
$ source ~/.profile
然后就可以通过 cobra-cli 命令初始化一个 cobra 项目啦。
如果 go install 之后 cobra-cli 命令不可用,可以找到二进制文件的具体位置执行二进制文件,或添加 gopath 的环境变量。
cobra-cli init
这样我们就初始化好了一个 cobra 项目。
Cobra子命令
我们通过 vscode 打开项目文件,可以看到代码非常简洁。其中 main.go 文件就是去执行 cmd 的 execute 函数
而 cmd/root.go 中的 Execute 函数是去执行 rootCmd 的 execute
然后我们通过下面的命令,给 rootcmd 添加一个子命令 version
cobra-cli add version
可以看到项目里 cmd 目录下新增了 version.go 文件
这时我们可以发现每个 cmd 下的文件都是一个 cobra.Command ,其中都使用了几个参数。其中 use 就是每个命令的名称。
通过对里面的参数进行简单的修改,下面来了解一下每个参数的具体含义
var versionCmd = &cobra.Command{
Use: "version",
Short: "版本信息",
Long: `一个较长的带回车
的
版本信息`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("version v0.0.1")
},
}
执行 go build 生成可执行的二进制文件,执行 version 子命令
go build
cobra-demo version
我们发现子命令的输出就是 version.go 的 Run 函数的执行结果。执行 -h 可以打印 help
cobra-demo version -h
我们在 help 中发现 Long 参数的内容输出是子命令的 help 最上面的介绍文字。
而 Short 参数则是在上级命令的 help 里对子命令的简单介绍。
Cobra的Flags
我们用相同的方法生成两个子命令 cmd1、cmd2,然后修改 cmd/cmd2.go 的init函数。
func init() {
cmd1Cmd.AddCommand(cmd2Cmd)
}
这样的话,就将 cmd2 变成了 cmd1 的子命令
我们将 cmd1 的 init 中注释给的两个例子取消注释。一个flag,一个PersistentFlags。
然后给 flag toggle 添加一个 MarkFlagRequired
func init() {
rootCmd.AddCommand(cmd1Cmd)
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
cmd1Cmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
cmd1Cmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
cmd1Cmd.MarkFlagRequired("toggle")
}
Flags 就是 cmd1 命令的参数,在调用 cmd1 时可以在后面添加 --toggle 使用,也可以用 -t 缩写,参数类型是 Bool 类型,默认值为 false。
PersistentFlags 表示 cmd1 及其子命令都可以使用的参数。
MarkFlagRequired 表示必填参数
可以看到,cmd1 命令如果没有 --toggle 参数是无法执行的
并且 cmd1 和 cmd2 都可以使用 --foo 参数。
Cobra Run函数的执行顺序
Cobra 命令除了 Run 函数,还有其他几个函数,我们修改 rootCmd 的定义如下。
var rootCmd = &cobra.Command{
Use: "cobra-demo",
Short: "A brief description of your application",
Long: `A longer description`
PersistentPreRun: func(cmd *cobra.Command, args []string) {
fmt.Println("PersistentPreRun")
},
PreRun: func(cmd *cobra.Command, args []string) {
fmt.Println("PreRun")
},
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Run")
},
PostRun: func(cmd *cobra.Command, args []string) {
fmt.Println("PostRun")
},
PersistentPostRun: func(cmd *cobra.Command, args []string) {
fmt.Println("PersistentPostRun")
},
}
根据命令执行的输出结果可以辨别出这几个函数的执行顺序。
PersistentPreRun -> PreRun -> Run -> PostRun -> PersistentPostRun
其中 PersistentPreRun 和 PersistentPostRun 函数是当前命令及其子命令都会运行的函数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)