Skip to content

在 Go 中创建命令行界面(CLI)应用程序非常常见,尤其是在构建工具、脚本或自动化系统时。Go 的标准库已经提供了基本的命令行处理功能,但对于复杂的 CLI 程序,通常使用第三方库来简化开发过程。

常见的 Go CLI 库

  1. flag:Go 标准库中的命令行标志(Flags)库,适合简单的命令行应用。
  2. cobra:一个强大的库,支持创建复杂的命令行应用程序,广泛应用于很多 Go 项目(如 Kubernetes)。
  3. urfave/cli:另一个流行的 Go CLI 库,提供简单的接口和更多的功能,适用于构建强大的命令行工具。

下面分别介绍如何使用这些库创建 Go CLI。


1. 使用 flag 创建简单的 CLI

flag 是 Go 标准库的一部分,适用于简单的命令行应用。你可以使用它来定义标志、解析命令行参数等。

示例:

go
package main

import (
	"flag"
	"fmt"
)

func main() {
	// 定义命令行标志
	name := flag.String("name", "World", "your name")
	age := flag.Int("age", 25, "your age")

	// 解析命令行标志
	flag.Parse()

	// 使用命令行参数
	fmt.Printf("Hello, %s! You are %d years old.\n", *name, *age)
}

使用方式:

bash
go run main.go --name=Alice --age=30

输出:

Hello, Alice! You are 30 years old.

常用的 flag 函数:

  • flag.String(name, defaultValue, usage): 定义一个字符串标志
  • flag.Int(name, defaultValue, usage): 定义一个整数标志
  • flag.Bool(name, defaultValue, usage): 定义一个布尔值标志
  • flag.Parse(): 解析命令行标志

2. 使用 cobra 创建复杂的 CLI

cobra 是一个功能强大的库,适用于构建多命令、多子命令的命令行应用程序。它支持子命令、自动生成帮助信息、命令和标志的组合等功能。

安装 cobra

bash
go get -u github.com/spf13/cobra

示例:

go
package main

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

func main() {
	// 创建根命令
	var rootCmd = &cobra.Command{
		Use:   "cliapp",
		Short: "CLI应用程序",
		Long:  "这是一个用 Go 和 Cobra 构建的命令行应用程序",
	}

	// 创建子命令
	var cmdGreet = &cobra.Command{
		Use:   "greet",
		Short: "打印问候信息",
		Run: func(cmd *cobra.Command, args []string) {
			fmt.Println("Hello, World!")
		},
	}

	// 创建另一个子命令
	var cmdAdd = &cobra.Command{
		Use:   "add",
		Short: "加法运算",
		Run: func(cmd *cobra.Command, args []string) {
			var num1, num2 int
			fmt.Println("请输入两个数字:")
			fmt.Scanf("%d %d", &num1, &num2)
			fmt.Printf("结果:%d\n", num1+num2)
		},
	}

	// 将子命令添加到根命令
	rootCmd.AddCommand(cmdGreet, cmdAdd)

	// 执行命令
	if err := rootCmd.Execute(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

使用方式:

bash
go run main.go greet
# 输出: Hello, World!

go run main.go add
# 输入两个数字
# 输出: 结果: <sum>

cobra 允许你轻松地为 CLI 添加子命令,并为每个命令定义不同的功能。你可以通过 rootCmd.AddCommand(cmdName) 为根命令添加子命令。

cobra 常用功能:

  • Use: 定义命令的名称
  • Short: 定义命令的简短描述
  • Run: 命令的执行函数
  • AddCommand(): 向根命令添加子命令

生成自动化帮助信息

cobra 会自动生成帮助信息,你只需要定义 ShortLong 描述,命令行工具会自动处理帮助信息:

bash
go run main.go --help

3. 使用 urfave/cli 创建简单 CLI

urfave/cli 是另一个流行的 Go 库,用于创建命令行应用。它非常简洁,适用于构建功能强大的命令行程序。

安装 urfave/cli

bash
go get -u github.com/urfave/cli/v2

示例:

go
package main

import (
	"fmt"
	"os"

	"github.com/urfave/cli/v2"
)

func main() {
	app := &cli.App{
		Name:  "cliapp",
		Usage: "这是一个 CLI 应用程序示例",

		// 定义命令
		Commands: []*cli.Command{
			{
				Name:  "greet",
				Usage: "打印问候信息",
				Action: func(c *cli.Context) error {
					fmt.Println("Hello, World!")
					return nil
				},
			},
			{
				Name:  "add",
				Usage: "加法运算",
				Action: func(c *cli.Context) error {
					var num1, num2 int
					fmt.Println("请输入两个数字:")
					fmt.Scanf("%d %d", &num1, &num2)
					fmt.Printf("结果:%d\n", num1+num2)
					return nil
				},
			},
		},
	}

	// 执行 CLI
	err := app.Run(os.Args)
	if err != nil {
		fmt.Println(err)
	}
}

使用方式:

bash
go run main.go greet
# 输出: Hello, World!

go run main.go add
# 输入两个数字
# 输出: 结果: <sum>

urfave/cli 常用功能:

  • Commands: 定义命令的列表
  • Action: 该命令的执行逻辑
  • Name: 命令的名称
  • Usage: 命令的简短描述

4. 其他 Go CLI 库

  • kingpin: 一个功能强大的命令行解析库,支持命令和标志的组合。

  • go-commander: 一个简洁的命令行框架,易于构建简单的命令行工具。


总结

  • 简单命令行程序可以使用 Go 标准库中的 flag 包。
  • 复杂的多命令程序可以使用 cobra,它支持多命令、嵌套命令和自动帮助生成。
  • 简洁且易用的库urfave/cli 提供了清晰、简洁的命令行工具构建方式,适合中小型项目。

对于更复杂的需求(例如支持子命令、自动帮助信息和配置文件解析),推荐使用 cobraurfave/cli 库。如果你的应用需求较简单,flag 也可以胜任。