Go语言搬砖 cobra命令行工具包

「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」。

简介

cobra是大佬 spf13 的一个现代化的CLI工具包,业界有名的kubernetes和docker都有使用它作为客户端命令行工具

另外大佬spf13还有其他比较流行的项目,比如配置工具viper,静态网站生成器hugo等

cobra官网: github.com/spf13/cobra

cobra特点

  • 子命令编写简单
  • 支持嵌套子命令
  • 智能建议(语义化识别)
  • 自带帮助标识 -h、–help等
  • 命令和标识等自动生成(需先定义结构)
  • 完全符合POSIX的标志,包括短版和长版
  • 可以自定义帮助,用法等
  • 自动生成命令补全功能

概念

cobra建立在命令、参数和标志的结构上,命令代表动作,参数是事物,标志是这些动作的修饰符

最好的cobra命令行工具在使用时读起来像句子,非常便于理解(模式: appname command arg –flag)

安装

基于go model的方式安装

1
js复制代码go get -u github.com/spf13/cobra

在代码中引入

1
js复制代码import "github.com/spf13/cobra"

使用

编写第一个demo

此demo中定义了一个子命令print, 将接收到的参数打印出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
js复制代码package main

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

func main() {

//定义命令结构
var cmdPrint = &cobra.Command{
Use: "print",
Short: "该命令的简短描述",
Long: "该命令的详细描述",
//定义最小参数个数
Args: cobra.MinimumNArgs(1),
//命令执行的入口
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("print: "+ strings.Join(args,""))
},
}
cmdPrint.Execute()
}

运行会报错,因为结构中声明了最小参数个数
image.png

如果想在代码编辑器中运行,需要编辑配置,设置程序参数 那一行

image.png

image.png

仿docker部分命令的demo

使用cobra编写命令行工具,调用系统上的docker命令进行操作,也可以伪装其他命令

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
js复制代码package main

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

func main() {

var cmdPs = &cobra.Command{
Use: "ps",
Short: "列出容器",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("--------容器列表--------")
args = []string{"ps"}
dockerPrint("docker",args)
},
}

var cmdImages = &cobra.Command{
Use: "images",
Short: "列出镜像",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("--------镜像列表--------")
args = []string{"images"}
dockerPrint("docker",args)
},
}

var cmdLogs = &cobra.Command{
Use: "logs",
Short: "查看容器日志",
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("--------查看日志--------")
args = []string{"logs",strings.Join(args,"")}
dockerPrint("docker",args)
},
}

var rootCmd = &cobra.Command{Use: "docker"}
rootCmd.AddCommand(cmdPs, cmdImages,cmdLogs)
rootCmd.Execute()

}

func dockerPrint(docker string,args []string) {
cmd := exec.Command(docker, args...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr

cmd.Run()
cmd.Wait()
}

运行后截图

image.png

总结

本文只是简单的实践了一下cobra创建命令行工具,可以发现编写命令行工具非常简单和快速。。

官网比较推荐的方法是使用cobra init直接生成骨架,然后直接写入相关逻辑,感兴趣的伙伴可以看看,传送门: github.com/spf13/cobra…

image.png

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%