go第三方库 - Cobra
| 阅读 | 共 1195 字,阅读约
Overview
k8s的命令行工具-cobra框架
简介
Cobra 是一个创建强大的现代化Cli命令行应用程序的go语言库。很多知名的开源软件都使用Cobra实现Cli。比如:
- k8s:kubectl等多个组件都用到
- Istio: istioctl命令
- Docker:docker命令
- Etcd:etcd命令
- Helm
- RClone
spf13这个github项目的大佬开发了好几个知名的项目。比如: hugo:世界上最快的构建静态网站的项目(该文档的博客系统就是用hugo搭建的) cobra:今天的主角,命令行框架 viper:配置信息处理框架
特性
- 支持子命令行模式
- 命令智能建议
- 轻松生成应用程序和命令
- 自动生成命令和参数的帮助信息
- 自动生成详细的命令行帮助
- 自动识别 -h –help
- bash环境下自动补全
- 自动生成帮助手册
基本概念
Cobra基于三个基本结构构建应用程序:
- Commands:表示执行动作。是应用程序交互的中心,支持子命令 SubCommand
- Args:执行参数
- Flags:动作的标识符,可以修改command的行为
展现形式为: APPNAME VERB NOUN –ADJECTIVE. 或者 APPNAME COMMAND ARG –FLAG
安装
- 通过
go get
安装最新版本库
1go get github.io/spf13/cobra
- 引入包名
1import "github.com/spf13/cobra"
快速上手
基本操作包括三步:
- 创建command主命令,并定义Run执行函数(只定义,还没有执行),AddCommand可以添加命令或者子命令
- 为命令添加命令行参数
- 执行Execute命令(会在内部回调Run函数)
1func main() {
2 var Version bool
3
4 var rootCmd = &cobra.Command{
5 Use: "root [sub]",
6 Short: "root command",
7 Run: func(cmd *cobra.Command, args []string) {
8 fmt.Printf("Inside rootCmd Run with args: %v\n", args)
9 if Version {
10 fmt.Println("Version: 1.0")
11 }
12 },
13 }
14
15 flags := rootCmd.Flags()
16 // 设置flags
17 // 参数含义依次是:接收参数的变量,命令行参数名称,名称简写,默认值,参数提示信息
18 flags.BoolVarP(&Version, "version", "v", false, "print version information")
19
20 // 开始执行
21 _ = rootCmd.Execute()
22}
添加额外的command
1rootCmd.AddCommand(&cobra.Command{
2 Use: "hello",
3 Short: "hello",
4 Run: func(cmd *cobra.Command, args []string) {
5 fmt.Printf("hello")
6 },
7 })
Flags
Flags分为全局flag和局部flag:
- 全局flag:对所有的command生效。rootCmd.PersistentFlags()
- 局部flag:只对特定的command生效。localCmd.Flags()
模板脚手架
cobra提供命令行工具,支持快速搭建cli应用程序,代替手工编写繁琐代码
1# 引入包依赖
2go get -u github.com/spf13/cobra/cobra
3# 使用模板脚手架
4cobra init --pkg-name cobraDemo
5cd cobraDemo
6# 查看目录结构
7tree .
8.
9├── LICENSE
10├── cmd
11│ └── root.go
12└── main.go
生命周期
Command中的Run字段,是执行的核心方法。Cobra支持应用生命周期的配置,运行在执行Run方法的前后定义业务逻辑。具体的执行顺序为:
- PersistentPreRun
- PreRun
- Run
- PostRun
- PersistentPostRun
1var rootCmd = &cobra.Command{
2 Use: "root [sub]",
3 Short: "My root command",
4 PersistentPreRun: func(cmd *cobra.Command, args []string) {
5 fmt.Printf("Inside rootCmd PersistentPreRun with args: %v\n", args)
6 },
7 PreRun: func(cmd *cobra.Command, args []string) {
8 fmt.Printf("Inside rootCmd PreRun with args: %v\n", args)
9 },
10 Run: func(cmd *cobra.Command, args []string) {
11 fmt.Printf("Inside rootCmd Run with args: %v\n", args)
12 },
13 PostRun: func(cmd *cobra.Command, args []string) {
14 fmt.Printf("Inside rootCmd PostRun with args: %v\n", args)
15 },
16 PersistentPostRun: func(cmd *cobra.Command, args []string) {
17 fmt.Printf("Inside rootCmd PersistentPostRun with args: %v\n", args)
18 },
19 }
拼写错误智能提示
默认是开启拼写错误智能提示的,如果想关闭,可以如下设置
底层使用了字符串相似度算法(编辑距离算法 Levenshtein Distance),由俄罗斯科学家Vladimir Levenshtein在1965年提出
1command.DisableSuggestions = true