go语言之CLI框架:cobra

📦 第一步:安装 Cobra CLI 工具

1
go install github.com/spf13/cobra-cli@latest

确保 $GOPATH/bin 在你的 PATH 中,然后你可以运行:

1
cobra-cli --help

🧱 第二步:初始化项目

创建你的 Go 项目目录:

1
2
mkdir tasker && cd tasker
go mod init github.com/yourname/tasker

使用 cobra-cli 初始化:

1
cobra-cli init --pkg-name github.com/yourname/tasker

这会生成如下结构:

1
2
3
4
tasker/
├── cmd/
│ └── root.go
├── main.go

🚀 第三步:运行项目

在当前目录运行:

1
go run main.go

输出将会是:

1
tasker is a CLI application

你可以查看帮助:

1
go run main.go --help

➕ 第四步:添加子命令

示例:添加 add 命令

1
cobra-cli add add

编辑 cmd/add.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package cmd

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

var addCmd = &cobra.Command{
Use: "add [task]",
Short: "添加一个新任务",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
task := args[0]
fmt.Printf("添加任务: %s\n", task)
},
}

func init() {
rootCmd.AddCommand(addCmd)
}

现在你可以运行:

1
go run main.go add "写 Cobra 教程"

📋 第五步:添加 list 命令

1
cobra-cli add list

编辑 cmd/list.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package cmd

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

var tasks = []string{}

var listCmd = &cobra.Command{
Use: "list",
Short: "列出所有任务",
Run: func(cmd *cobra.Command, args []string) {
if len(tasks) == 0 {
fmt.Println("没有任务")
return
}
for i, task := range tasks {
fmt.Printf("%d. %s\n", i+1, task)
}
},
}

func init() {
rootCmd.AddCommand(listCmd)
}

📝 注意:数据结构在内存中,不持久化。可用 map[string]string 或写入文件模拟更复杂逻辑。


🎛 第六步:添加标志(flags)

比如我们想让 add 命令带一个 --priority 选项:

add.goinit() 函数中添加:

1
addCmd.Flags().StringP("priority", "p", "normal", "任务优先级")

并在 Run 中读取:

1
2
priority, _ := cmd.Flags().GetString("priority")
fmt.Printf("添加任务: %s(优先级: %s)\n", task, priority)

示例运行:

1
go run main.go add "学习 Go" --priority high

🧼 第七步:美化和构建项目

构建可执行文件:

1
2
go build -o tasker
./tasker --help

可以将 tasker 添加到系统 PATH 中,变成全局命令行工具。


📦 最终项目结构

1
2
3
4
5
6
7
tasker/
├── cmd/
│ ├── add.go
│ ├── list.go
│ └── root.go
├── go.mod
└── main.go