Cobra是一个用于创建强大的现代CLI应用程序的库。Cobra被用于许多go项目中,如Kubernetes, Hugo和Github CLI等。官方列举了使用cobra库的列表
Cobra主要特点:
首先需要明确 3 个基本概念:
下面拿我们经常使用git的命令对举例
git clone -b develop https://xxxx.git
git config --global user.name "bettyaner"
git commit -m "xxxx"
上述的命令中:
- git是应用程序的名称,
- clone/config/commit是一个命令(Command)或者子命令
- b/-m/–global为选项(Flag)
- 选项后面的值为具体的参数(Arg)
go get -u github.com/spf13/cobra@latest
使用的时候我们需要在项目中引用cobra
import (
"github.com/spf13/cobra"
)
我们先在cmd的目录下cobra.go创建cobra的根命令:
var author string
var rootCmd = &cobra.Command{
Use: "cobra [string to action]",
Short: "cobra command tool",
Long: "cobra is a simple cli command tool",
PersistentPreRun: func(cmd *cobra.Command, args []string) {
log.Println("1. rootCmd PersistentPreRun")
},
PreRun: func(cmd *cobra.Command, args []string) {
log.Println("2. rootCmd PreRun")
//setup()
},
Run: func(cmd *cobra.Command, args []string) {
log.Println("3. rootCmd Run, auth:" + author)
run()
},
PostRun: func(cmd *cobra.Command, args []string) {
log.Println("4. rootCmd PostRun")
},
PersistentPostRun: func(cmd *cobra.Command, args []string) {
log.Println("5. rootCmd PersistentPostRun")
},
}
func init(){
rootCmd.PersistentFlags().StringVar(&author, "author", "CKeen", "Author name for copyright attribution")
rootCmd.AddCommand(version.VersionCmd)
}
func run(){
fmt.Println("go root cmd run")
}
func Execute() {
if err := rootCmd.Execute(); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
我们在工程目录创建一个main.go,来调用上面的命令:
func main(){
cmd.Execute()
}
我们将代码编译为cobra的执行文件:
go build -o cobra
我们可以看到生成了一个cobra的可执行文件,然后我们来查看一下使用帮助:
$./cobra --help
我们可以看到控制台打印了如下信息:
cobra is a simple cli command tool
Usage:
cobra [string to action] [flags]
cobra [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
help Help about any command
version app version
Flags:
--author string Author name for copyright attribution (default "YOUR NAME")
-h, --help help for cobra
Use "cobra [command] --help" for more information about a command.
对比以上我们可以内容,我们知道:
我们在cmd/version的目录下来看下VersionCmd的代码:
var version string
var VersionCmd = &cobra.Command{
Use: "version",
Short: "app version",
Long: "print this app current version",
Example: "./cobra version",
Args: nil,
Version: "v1.0",
PersistentPreRun: func(cmd *cobra.Command, args []string) {
log.Println("1. versionCmd PersistentPreRun")
},
PreRun: func(cmd *cobra.Command, args []string) {
log.Println("2. versionCmd PreRun")
},
Run: func(cmd *cobra.Command, args []string) {
log.Println("3. versionCmd Run")
},
PostRun: func(cmd *cobra.Command, args []string) {
log.Println("4. versionCmd PostRun")
},
PersistentPostRun: func(cmd *cobra.Command, args []string) {
log.Println("5. versionCmd PersistentPostRun")
},
}
func init(){
VersionCmd.PersistentFlags().StringVarP(&version, "v", "v", "v.10", "app version")
}
我们可以使用子命令的help来查看
$./cobra version --help
我们可以看到打印了如下部分:
print this app current version
Usage:
cobra version [flags]
Examples:
./cobra version
Flags:
-h, --help help for version
-v, --v string app version (default "v.10")
--version version for version
Global Flags:
--author string Author name for copyright attribution (default "YOUR NAME")
我们可以看到这里的描述跟rootCmd查不多,也是配置的那几个参数,这里我们多配置了一个Example示例,这个Example在help打印中也展示出来了。
同时这里可以看到还支持Global Flags,这个参数是我们在rootCmd中进行配置的,这里说明我们这里可以使用rootCmd的中的flag值。
首先我们执行一下上一节中编译的cobra的可执行文件,同时传入–author的flag选项
$./cobra --author CKeen
我们可以看到如下打印信息:
2022/07/10 01:01:41 1. rootCmd PersistentPreRun
2022/07/10 01:01:41 2. rootCmd PreRun
2022/07/10 01:01:41 3. rootCmd Run, auth:CKeen
go root cmd run
2022/07/10 01:01:41 4. rootCmd PostRun
2022/07/10 01:01:41 5. rootCmd PersistentPostRun
我们看到author选项设置了值,在rootCmd的Run方法中打印出来了,同时我们可以看到Command执行提供如下的回调执行顺序:
1. PersistentPreRun
2. PreRun
3.Run
4.PostRun
5.PersistentPostRun
我们一般将主要执行的业务逻辑放到Run中去执行,PreRun和PostRun可以做一些预处理的工作和执行后的清尾工作。
cobra源码github: https://github.com/spf13/cobra
cobra的包介绍: https://pkg.go.dev/github.com/spf13/cobra