Cobra 是 Go 的 CLI 框架。它包含一个用于创建功能强大的现代 CLI 应用程序的库,以及一个用于快速生成基于 Cobra 的应用程序和命令文件的工具。
Cobra 由 Go 项目成员和 hugo 作者 spf13 创建,已经被许多流行的 Go 项目采用,比如 GitHub CLI 和 Docker CLI。Docker
、Kubernetes、go-zero、kratos
等都有它的身影存在,一句话:只要你想写命令行使用cobra就够了。
主要功能
Cobra 的主要功能如下:
- 简易的子命令行模式,如
app server
,app fetch
等等。 - 完全兼容
posix
命令行模式。 - 嵌套子命令
subcommand
。 - 支持全局,局部,串联
flags
。 - 使用
cobra
很容易生成应用程序和命令(cobra init appname
和cobra add cmdname
)。 - 提供智能化的提示(如,输出
app srver
命令,将提示 你是要输入app server
吗?)。 - 自动生成
commands
和flags
的帮助信息。 - 自动生成详细的
help
信息,如app -help
。 - 自动识别帮助
flag
、-h
,--help
。 - 自动生成应用程序在
bash
下命令自动完成功能。 - 自动生成应用程序的
man
手册。 - 命令行别名。
- 自定义
help
和usage
信息。 - 可选的与
[viper](http://github.com/spf13/viper)
的紧密集成。
概念
Cobra 是基于命令(commands
)、参数(arguments
)、选项(flags
)而创建的。
在具体了解、使用Cobra前有一些概念需要提前知晓一下:命令(commands
)、参数(arguments
)、选项(flags
)这几个概念。
- commands:命令代表行为,一般表示 action,即运行的二进制命令服务。同时可以拥有子命令(children commands)
- arguments:参数代表命令行参数。
- flags:选项代表对命令行为的改变,即命令行选项。二进制命令的配置参数,可对应配置文件。参数可分为全局参数和子命令参数。
最好的命令行程序在实际使用时,就应该像在读一段优美的语句,能够更加直观的知道如何与用户进行交互。执行命令行程序应该遵循一般的格式: APPNAME VERB NOUN --ADJECTIVE
或 APPNAME COMMAND ARG --FLAG
。
比如下面的示例:
# server是 commands,port 是 flag
hugo server --port=1313
# clone 是 commands,URL 是 arguments,brae 是 flag
git clone URL --bare
你没有看错,像 Docker 这种这么复杂的命令都是用 Cobra 是实现的,其必有过人之处,下一节就让我们一起来看看如何实现一套属于自己的命令行工具吧!
安装
使用 go get
命令获取最新版本的 Cobra 库。下面命令将会安装 Cobra 及其相关依赖包:
go get -u github.com/spf13/cobra@latest
go install github.com/spf13/cobra-cli@latest //可选
如果不使用cobra
package main
import (
"flag"
"fmt"
)
func main() {
flag.Parse()
args := flag.Args()
if len(args) <= 0 {
fmt.Println("Usage: admin-cli [command]")
return
}
switch args[0] {
case "help":
// ...
case "export":
//...
if len(args) == 3 { // 导出到文件
// todo
} else if len(args) == 2 { // 导出...
// todo
}
default:
//...
}
}
使用cobra解决
package main
import (
"fmt"
"github.com/spf13/cobra"
"os"
)
// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
Use: "api",
Short: "A brief description of your application",
Long: `A longer description `,
}
// 命令一
var mockMsgCmd = &cobra.Command{
Use: "mockMsg",
Short: "批量发送测试文本消息",
Long: ``,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("mockMsg called")
},
}
// 命令二
var exportCmd = &cobra.Command{
Use: "export",
Short: "导出数据",
Long: ``,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("export called")
},
}
func Execute() {
err := rootCmd.Execute()
if err != nil {
os.Exit(1)
}
}
func init() {
rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
rootCmd.AddCommand(mockMsgCmd)
rootCmd.AddCommand(exportCmd)
exportCmd.Flags().StringP("out", "k", "./backup", "导出路径")
}
func main() {
Execute()
}
基本概念
Cobra由三部分组成:
- 命令(Commands ):代表行为。命令是程序的中心点,程序的每个功能都应该可以通过命令进行交互,一个命令可以有任意个子命令。
- 参数(Args):命令的参数
- 标志(Flags):修饰命令。它修饰命令该如何完成。
官方推荐命令格式为:
$ ./appName command args --Flag
如 hugo server —port=1313 :
- appName: hugo
- command: server
- flag: port
命令行CLI工具(可选)
建议安装命令行工具 cobra-cli ,以方便快速创建cobra项目,增加command等。
$ go install github.com/spf13/cobra-cli@latest
[
上一节
2. protoc自定义gin插件
](https://www.imooc.com/wiki/NewGo/seht2c1jBkIOnvHlJYrM.html)[
下一节
](https://www.imooc.com/wiki/NewGo/Ge3OTL6i7sVgDQCdhntz.html)