spf13/cobra
是一个 Go 语言的命令行应用程序库,它提供了一种方便的方式来构建命令行工具(CLI)。Cobra 允许你定义命令、子命令、标志和参数,以及通过命令行传递的配置项。它广泛应用于许多流行的 Go 项目中,包括 Kubernetes 和 Helm 等。
--flag
)和短标志(如 -f
)来传递参数。spf13/viper
配合使用:与 viper
库结合使用时,可以轻松管理应用的配置,包括读取文件、环境变量等。使用 go get
安装 spf13/cobra
:
go get -u github.com/spf13/cobra@v1.5.0
cobra.Command
是最基本的结构,它表示一个命令或子命令。一个命令可以有很多选项、参数以及执行的操作。-v
(显示版本)或 -f
(指定文件)。rootCmd
),该命令下可以有多个子命令。git commit
、git push
等命令。下面是一个简单的示例,展示如何使用 cobra
创建一个命令行工具。
package main
import (
"fmt"
"github.com/spf13/cobra"
"os"
)
var rootCmd = &cobra.Command{
Use: "mycli", // 命令行工具的名称
Short: "A simple CLI tool", // 简短描述
Long: "A simple command line application built with Cobra", // 完整描述
Run: func(cmd *cobra.Command, args []string) {
// 这里是 rootCmd 执行的逻辑
fmt.Println("Hello, Cobra!")
},
}
func main() {
// 启动根命令
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
运行上面的代码,你会得到:
$ go run main.go
Hello, Cobra!
你可以为根命令添加多个子命令。在下面的示例中,我们创建了两个子命令:hello
和 goodbye
。
package main
import (
"fmt"
"github.com/spf13/cobra"
"os"
)
var rootCmd = &cobra.Command{
Use: "mycli",
Short: "A simple CLI tool",
}
var helloCmd = &cobra.Command{
Use: "hello",
Short: "Prints Hello message",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Hello!")
},
}
var goodbyeCmd = &cobra.Command{
Use: "goodbye",
Short: "Prints Goodbye message",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Goodbye!")
},
}
func main() {
// 注册子命令
rootCmd.AddCommand(helloCmd, goodbyeCmd)
// 执行根命令
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
运行:
$ go run main.go hello
Hello!
$ go run main.go goodbye
Goodbye!
Cobra 允许你为命令和子命令添加标志。标志是通过命令行传递的选项,可以是必需的或者可选的。
package main
import (
"fmt"
"github.com/spf13/cobra"
"os"
)
var name string
var helloCmd = &cobra.Command{
Use: "hello",
Short: "Prints Hello message",
Run: func(cmd *cobra.Command, args []string) {
if name != "" {
fmt.Printf("Hello, %s!\n", name)
} else {
fmt.Println("Hello!")
}
},
}
func init() {
// 为 helloCmd 命令添加一个 -n 或 --name 标志
helloCmd.Flags().StringVarP(&name, "name", "n", "", "Name to greet")
}
func main() {
// 注册子命令
var rootCmd = &cobra.Command{Use: "mycli"}
rootCmd.AddCommand(helloCmd)
// 执行根命令
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
运行:
$ go run main.go hello --name "Alice"
Hello, Alice!
$ go run main.go hello -n Bob
Hello, Bob!
在上面的示例中,--name
或 -n
是一个标志,用于传递给 helloCmd
子命令。当 name
参数为空时,它会默认打印 Hello!
,否则打印带有指定名字的问候语。
Cobra 会自动为每个命令生成帮助信息。当你运行命令时,使用 -h
或 --help
标志可以查看帮助文档。
$ go run main.go hello --help
Usage:
mycli hello [flags]
Flags:
-h, --help help for hello
-n, --name string Name to greet
你可以使用 spf13/viper
来管理配置文件,并将其与 cobra
命令行工具结合使用。这样,命令行参数可以与配置文件、环境变量等绑定。
package main
import (
"fmt"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"os"
)
var rootCmd = &cobra.Command{
Use: "mycli",
Short: "A simple CLI tool",
}
func init() {
// 绑定配置文件和环境变量
viper.SetConfigName("config") // config.yaml
viper.AddConfigPath(".") // 查找当前目录下的配置文件
// 如果配置文件不存在,自动创建
if err := viper.ReadInConfig(); err != nil {
fmt.Println("Error reading config file:", err)
}
}
var greetCmd = &cobra.Command{
Use: "greet",
Short: "Greet user based on config or flags",
Run: func(cmd *cobra.Command, args []string) {
// 读取配置文件中的 "name" 配置
name := viper.GetString("name")
if name == "" {
name = "stranger"
}
fmt.Printf("Hello, %s!\n", name)
},
}
func main() {
rootCmd.AddCommand(greetCmd)
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
配置文件 config.yaml
:
name: Alice
运行时:
$ go run main.go greet
Hello, Alice!
你可以使用 viper
绑定环境变量。这样,在没有提供命令行标志时,可以从环境变量中读取参数。
export MYCLI_NAME="Bob"
然后在代码中使用:
viper.BindEnv("name", "MYCLI_NAME")
Cobra 允许你在命令执行之前和之后添加钩子函数。例如:
var myCmd = &cobra.Command{
Use: "mycmd",
PreRun: func(cmd *cobra.Command, args []string) {
fmt.Println("Before executing the command")
},
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Executing command...")
},
PostRun: func(cmd *cobra.Command, args []string) {
fmt.Println("After executing the command")
},
}
spf13/cobra
是一个功能强大的库,专门用于
构建命令行工具。它为你提供了丰富的功能来组织和处理命令、子命令、标志、参数等,适用于从简单的工具到复杂的 CLI 应用程序的构建。Cobra 的一些关键特点包括:
viper
配合使用,支持从配置文件、环境变量和命令行读取配置。借助 Cobra,你可以轻松构建功能强大且灵活的命令行应用程序。