1. 介绍

Cobra 是一个用于创建强大的现代 CLI 应用程序的库。如果你使用 Go,并且正在寻找一个简单而强大的库来创建 CLI 应用程序,那么你可能会对 Cobra 感兴趣。

2. 安装

go mod init your-project-name
go get -u github.com/spf13/cobra@latest

3. 初始化项目

使用 Cobra CLI 工具快速创建项目结构

# 安装 cobra-cli
go install github.com/spf13/cobra-cli@latest

# 初始化项目
cobra-cli init

4. 基础用法示例

创建一个简单的CLI应用:

package main

import (
    "fmt"
    "github.com/spf13/cobra"
    "os"
)

var rootCmd = &cobra.Command{
    Use:   "myapp",
    Short: "一个简单的CLI应用",
    Long:  `这是一个使用Cobra构建的命令行应用示例。`,
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Println("欢迎使用 myapp!")
    },
}

func main() {
    if err := rootCmd.Execute(); err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
}

5. 添加子命令

var versionCmd = &cobra.Command{
    Use:   "version",
    Short: "显示版本信息",
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Println("myapp v1.0.0")
    },
}

var configCmd = &cobra.Command{
    Use:   "config",
    Short: "配置管理",
    Long:  `用于管理应用配置的命令`,
}

var setConfigCmd = &cobra.Command{
    Use:   "set [key] [value]",
    Short: "设置配置项",
    Args:  cobra.ExactArgs(2),
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Printf("设置 %s = %s\n", args[0], args[1])
    },
}

func init() {
    rootCmd.AddCommand(versionCmd)
    rootCmd.AddCommand(configCmd)
    configCmd.AddCommand(setConfigCmd)
}

6. 使用Flags

var (
    verbose bool
    output  string
)

func init() {
    // 全局flags
    rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "详细输出")
    
    // 本地flags
    rootCmd.Flags().StringVarP(&output, "output", "o", "", "输出文件路径")
    
    // 必需的flag
    configCmd.MarkFlagRequired("config")
}

7. 参数验证

var exampleCmd = &cobra.Command{
    Use:   "example",
    Short: "参数验证示例",
    Args:  cobra.MinimumNArgs(1), // 至少需要1个参数
    // Args: cobra.ExactArgs(2),    // 恰好需要2个参数
    // Args: cobra.RangeArgs(1, 3), // 需要1-3个参数
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Printf("接收到参数: %v\n", args)
    },
}

8. 完整示例

package main

import (
    "fmt"
    "github.com/spf13/cobra"
    "os"
)

var (
    verbose bool
    config  string
)

var rootCmd = &cobra.Command{
    Use:   "myapp",
    Short: "一个功能完整的CLI应用",
    Long:  `使用Cobra构建的命令行应用,展示了commands、arguments和flags的使用。`,
}

var serverCmd = &cobra.Command{
    Use:   "server",
    Short: "启动服务器",
    Run: func(cmd *cobra.Command, args []string) {
        if verbose {
            fmt.Println("启用详细模式")
        }
        fmt.Printf("使用配置文件: %s\n", config)
        fmt.Println("服务器已启动...")
    },
}

func init() {
    rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "启用详细输出")
    rootCmd.PersistentFlags().StringVar(&config, "config", "", "配置文件路径")
    
    rootCmd.AddCommand(serverCmd)
}

func main() {
    if err := rootCmd.Execute(); err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
}

9. 使用示例

编译并运行

go build -o myapp

# 显示帮助
./myapp --help

# 运行服务器命令
./myapp server --verbose --config config.yaml

# 使用短标志
./myapp server -v --config config.yaml

10. 总结

  • 命令结构设计: 保持命令层级简洁,避免过深的嵌套
  • 帮助信息: 为每个命令提供清晰的Short和Long描述
  • 错误处理: 合理处理命令执行中的错误情况
  • 参数验证: 使用Cobra提供的Args验证器确保输入正确
  • 代码组织: 将不同的命令分别放在不同的文件中管理