go命令行库:sp13/cobra和 urfave/cli 对比

675 阅读2分钟

sp13/cobraurfave/cli 是两个流行的 Go 语言库,用于构建命令行界面(CLI)应用程序。它们在设计哲学和使用方式上各有特色。下面,我将对这两个库进行对比,并通过示例说明它们的使用方式。

1. 设计哲学

  • Cobra

    • 设计理念: Cobra 强调 CLI 的层次结构,适合构建复杂的多层次命令行工具。它通过命令(Command)和子命令(Subcommand)的结构来组织。
    • 自动生成文档: Cobra 可以自动生成基于命令的帮助文档,包括支持 man 页面。
    • 与 Viper 集成: Cobra 通常与 Viper 配合使用,提供强大的配置管理功能。
  • Urfave/cli

    • 设计理念: Urfave/cli 提供了一个简单的、扁平的 API,用于构建轻量级的 CLI 工具。它将所有命令和选项扁平地放在一个层级中,适合快速开发和部署。
    • 简化的用法: Urfave/cli 强调简洁和易用性,使得简单的 CLI 工具能够快速上手。

2. 基本使用示例

Cobra 示例

package main
​
import (
    "fmt"
    "github.com/spf13/cobra"
)
​
func main() {
    var rootCmd = &cobra.Command{
        Use:   "app",
        Short: "This is a sample app",
    }
​
    var echoCmd = &cobra.Command{
        Use:   "echo [message]",
        Short: "Echo the input message",
        Args:  cobra.MinimumNArgs(1),
        Run: func(cmd *cobra.Command, args []string) {
            fmt.Println(args[0])
        },
    }
​
    rootCmd.AddCommand(echoCmd)
    rootCmd.Execute()
}
  • 运行结果

    • app echo "Hello, World!" 输出: Hello, World!

在这个例子中,cobra 通过 Command 对象来定义命令,并允许嵌套多个子命令。

Urfave/cli 示例

package main
​
import (
    "fmt"
    "os""github.com/urfave/cli/v2"
)
​
func main() {
    app := &cli.App{
        Name:  "app",
        Usage: "This is a sample app",
        Commands: []*cli.Command{
            {
                Name:    "echo",
                Usage:   "Echo the input message",
                Aliases: []string{"e"},
                Action: func(c *cli.Context) error {
                    fmt.Println(c.Args().First())
                    return nil
                },
            },
        },
    }
​
    err := app.Run(os.Args)
    if err != nil {
        fmt.Println(err)
    }
}
  • 运行结果

    • app echo "Hello, World!" 输出: Hello, World!

在这个例子中,urfave/cli 通过 Command 结构体来定义命令,并且每个命令都是扁平的,没有嵌套子命令的结构。

3. 对比总结

  • Cobra

    • 更适合复杂的、多层次的 CLI 工具。
    • 提供了更强大的功能,例如自动生成文档、与 Viper 集成等。
  • Urfave/cli

    • 适合简单的、轻量级的 CLI 工具。
    • 易于使用和快速开发,代码相对简洁。

根据需求选择适合的库。如果需要构建一个功能丰富且复杂的 CLI 工具,Cobra 是一个不错的选择;如果是一个简单的工具,Urfave/cli 可能更适合。