用 Go 语言和 Cobra 框架,10 分钟构建可跨平台分发的命令行工具。

核心概念 Link to heading

Cobra 是 Go 生态中最流行的 CLI 框架,Hugo、Kubernetes、GitHub CLI 等知名项目均基于它构建。

CLI 工具由三个基本元素组成:

元素说明示例
Command可执行的操作git clone 中的 clone
Flag控制行为的选项--verbose-o output.txt
Arg命令的输入参数git commit -m "msg" 中的 "msg"

Go 编译为单二进制文件,无需运行时环境,跨平台分发只需替换目标 GOOS/GOARCH。

安装配置 Link to heading

初始化项目并安装依赖:

mkdir greet-cli && cd greet-cli
go mod init greet-cli
go get -u github.com/spf13/cobra@latest
# 可选:安装脚手架工具
go install github.com/spf13/cobra-cli@latest
cobra-cli init

生成后的目录结构中,核心文件是 cmd/root.go,所有子命令在 cmd/ 下各自独立。

实际使用 Link to heading

添加子命令 Link to heading

cobra-cli add say

修改 cmd/say.go,添加一个带 --name 参数的子命令:

package cmd

import (
    "fmt"
    "os"

    "github.com/spf13/cobra"
)

var sayCmd = &cobra.Command{
    Use:   "say [message]",
    Short: "向某人打招呼",
    Args:  cobra.MinimumNArgs(1),
    RunE: func(cmd *cobra.Command, args []string) error {
        name, _ := cmd.Flags().GetString("name")
        if name == "" {
            return fmt.Errorf("--name flag is required")
        }
        fmt.Printf("Hello, %s! You said: %s\n", name, args[0])
        return nil
    },
}

func init() {
    rootCmd.AddCommand(sayCmd)
    sayCmd.Flags().StringP("name", "n", "", "称呼的名字")
    sayCmd.MarkFlagRequired("name")
}

关键点:

  • Args 校验参数数量,不满足时自动返回错误
  • RunE 替代 Run,可返回 error 让 Cobra 统一处理
  • MarkFlagRequired 标记必选 flag

构建与运行 Link to heading

go build -o greet .
./greet say "你好世界" --name Alice
# 输出: Hello, Alice! You said: 你好世界

# 查看帮助
./greet say --help

编译为其他平台 Link to heading

# macOS ARM
GOOS=darwin GOARCH=arm64 go build -o greet-darwin-arm64 .
# Windows
GOOS=windows GOARCH=amd64 go build -o greet.exe .
# Linux
GOOS=linux GOARCH=amd64 go build -o greet-linux-amd64 .

一个完整的 CLI 工具就是这样简单:定义命令、添加 flag、处理参数、编译分发。

官方链接 Link to heading

[1] https://github.com/spf13/cobra

[2] https://pkg.go.dev/github.com/spf13/cobra

[3] https://go.dev/doc/install

Signature Link to heading

本文由 AI 生成,不保证正确,仅作参考