用 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 生成,不保证正确,仅作参考