Cobra.dev 是一个关于 Go 语言的 CLI 框架。它包含一个用于创建强大、现代化的命令行应用程序的库,以及一个用于快速生成基于 Cobra 的应用程序和命令文件的工具。Cobra 由 Go 团队成员 spf13 为 Hugo 创建,并被最流行的 Go 项目所采用。
Cobra 提供以下功能:
- 基于子命令的 CLI:例如
app server
、app fetch
等。 - 完全符合 POSIX 标准的标志参数(包括短标志和长标志)。
- 嵌套的子命令。
- 全局、局部和级联的标志参数。
- 使用
cobra init appname
和cobra add cmdname
可以轻松生成应用程序和命令。 - 智能建议(例如
app srver
... 你是不是想输入app server
?)。 - 对命令和标志参数自动生成帮助文档。
- 对
-h
、--help
等标志参数自动识别为帮助标志。 - 为应用程序自动生成 Bash 自动补全。
- 为应用程序自动生成 man 页面。
- 命令别名,可以在不破坏现有命令的情况下更改命令。
- 灵活定义自己的帮助文档、用法等。
- 可选与 viper 紧密集成,用于支持 12 因素应用程序。
安装:
使用 Cobra 很简单。首先,使用 go get
安装最新版本的库。以下命令将安装 Cobra 生成器可执行文件,以及库和其依赖项:
bash
go get -u github.com/spf13/cobra/cobra
然后,在你的应用程序中引入 Cobra:
bash
import "github.com/spf13/cobra"
概念:
Cobra 基于命令、参数和标志参数的结构构建。命令表示操作,参数表示对象,标志参数表示对这些操作的修改。优秀的应用程序在使用时应该像句子一样可读。用户应该能够自然而然地理解如何使用应用程序。遵循的模式是:
Copy
bash
APPNAME VERB NOUN --ADJECTIVE
或者
bash
APPNAME COMMAND ARG --FLAG
以下是一些现实世界的示例。在下面的示例中,server
是一个命令,port
是一个标志参数:
bash
hugo server --port=1313
在这个命令中,我们告诉 Git 克隆该 URL 的裸库:
bash
git clone URL --bare
命令:
命令是应用程序的核心点。应用程序支持的每个交互都将包含在一个命令中。一个命令可以有子命令,并可选择运行一个操作。在上面的示例中,server
是一个命令。
关于 cobra.Command 的更多信息,请参阅文档。
标志参数:
标志参数是修改命令行行为的一种方式。Cobra 支持完全符合 POSIX 标准的标志参数,以及 Go flag 包的标志参数。Cobra 命令可以定义在子命令中持久存在的标志参数,以及仅对该命令可用的标志参数。在上面的示例中,port
是一个标志参数。标志参数的功能由 pflag 库提供,它是标准库 flag 的一个分支,保持相同的接口,并添加了 POSIX 的兼容性。
开始使用:
在使用 Cobra 构建的应用程序中,通常会遵循以下组织结构:
go
▾ appName/
▾ cmd/
add.go
your.go
commands.go
here.go
main.go
在 Cobra 应用时,你需要创建一个根命令和相应的子命令。以下是一个示例:
go
package main
import (
"fmt"
"github.com/spf13/cobra"
)
func main() {
rootCmd := &cobra.Command{
Use: "app",
Short: "一个示例应用程序",
Long: "这是一个示例应用程序,用于演示使用 Cobra 构建命令行应用程序。",
Run: func(cmd *cobra.Command, args []string) {
// 这是根命令的执行逻辑
fmt.Println("欢迎使用示例应用程序!")
},
}
// 添加子命令
rootCmd.AddCommand(&cobra.Command{
Use: "server",
Short: "启动服务器",
Run: func(cmd *cobra.Command, args []string) {
// 这是 server 子命令的执行逻辑
fmt.Println("正在启动服务器...")
},
})
rootCmd.Execute()
}
以上代码创建了一个名为 app
的根命令,并添加了一个名为 server
的子命令。根命令和子命令都定义了 Run
函数,用于指定命令的执行逻辑。在这个示例中,根命令的执行逻辑打印欢迎消息,而 server
子命令的执行逻辑打印正在启动服务器的消息。
你可以根据实际需求添加更多的命令和标志参数。使用 cobra.Command
和 cobra.Flag
类型的方法可以定义命令和标志参数的属性和行为。