「这是我参与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的方式安装
go get -u github.com/spf13/cobra
在代码中引入
import "github.com/spf13/cobra"
使用
编写第一个demo
此demo中定义了一个子命令print, 将接收到的参数打印出来
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()
}
运行会报错,因为结构中声明了最小参数个数
如果想在代码编辑器中运行,需要编辑配置,设置程序参数 那一行
仿docker部分命令的demo
使用cobra编写命令行工具,调用系统上的docker命令进行操作,也可以伪装其他命令
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()
}
运行后截图
总结
本文只是简单的实践了一下cobra创建命令行工具,可以发现编写命令行工具非常简单和快速。。
官网比较推荐的方法是使用cobra init直接生成骨架,然后直接写入相关逻辑,感兴趣的伙伴可以看看,传送门: github.com/spf13/cobra…