Go使用cobra构建命令行工具
安装CLI
1
|
go install github.com/spf13/cobra-cli@latest
|
创建项目并引入依赖
1
2
3
4
5
6
7
|
# 创建go项目
mkdir my_command
cd my_command
go mod init my_command
# 使用cobra-cli初始化项目
cobra-cli init
|
测试
1
2
|
go build main.go
main root
|
开发
命令
1
2
|
# 添加命令
cobra-cli add version
|
添加后在cmd
下生成一个新的文件 version.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
27
28
29
30
31
32
33
34
35
|
/*
Copyright © 2022 NAME HERE <EMAIL ADDRESS>
*/
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
// versionCmd represents the version command
var versionCmd = &cobra.Command{
Use: "version",
Short: "一个简短介绍",
Long: `一个长介绍`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("version命令操作")
},
}
func init() {
rootCmd.AddCommand(versionCmd)
// Here you will define your flags and configuration settings.
// Cobra supports Persistent Flags which will work for this command
// and all subcommands, e.g.:
// versionCmd.PersistentFlags().String("foo", "", "A help for foo")
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
// versionCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
|
执行命令

接受参数
存储在 args中
1
2
3
4
5
6
7
8
9
10
11
|
...
var versionCmd = &cobra.Command{
Use: "version",
Short: "一个简短介绍",
Long: `一个长介绍`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("version命令操作")
fmt.Println(args)
},
}
...
|

flag
局部flag
-
定义变量
1
2
3
4
|
/*
定义局部变量
*/
var all string
|
-
在对应文件的init方法中添加flag
1
|
versionCmd.Flags().StringVarP(&all, "all", "a", "这是默认值", "这是一条介绍")
|
-
使用 在run方法中
1
|
fmt.Println("a参数:"+all)
|
-
完整代码
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
27
28
29
30
31
32
33
34
35
|
/*
Copyright © 2022 NAME HERE <EMAIL ADDRESS>
*/
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
/*
定义局部变量
*/
var all string
// versionCmd represents the version command
var versionCmd = &cobra.Command{
Use: "version",
Short: "一个简短介绍",
Long: `一个长介绍`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("version命令操作")
fmt.Println(args)
fmt.Println("a参数:"+all)
},
}
func init() {
rootCmd.AddCommand(versionCmd)
versionCmd.Flags().StringVarP(&all, "all", "a", "这是默认值", "这是一条介绍")
//是否必填 默认可以不填
versionCmd.MarkFlagRequired("all")
}
|
-
演示

全局flag
在root中编写,代码与局部flag相同
嵌套命令
1
2
3
|
cobra-cli add -p "父命令Cmd"
# 举例
cobra-cli add show -p "versionCmd"
|
使用

代码解释

获取命令行参数
常用
1
2
3
4
|
MinimumNArgs(int) 当参数数目低于配置的最小参数个数时报错
MaximumNArgs(int) 当参数数目大于配置的最大参数个数时报错
ExactArgs(int) 如果参数数目不是配置的参数个数时报错
NoArgs 没有参数则报错
|
使用
1
2
3
4
5
6
7
8
9
10
11
12
13
|
...
var versionCmd = &cobra.Command{
Use: "version",
Short: "一个简短介绍",
Long: `一个长介绍`,
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("version命令操作")
fmt.Println(args)
fmt.Println("a参数:"+all)
},
}
...
|
测试
