一 背景
在云原生如日中天的当下,相信很多人对Kubernetes/etcd等都有所听闻,当我们看其源码或对其进行二次开发的时候,可以发现其均使用了一个命令行程序库Cobra,其是一个用来编写命令行的神器,提供了一个脚手架,用于快速生成基于Cobra应用程序框架。
其作者是非常有名的spf13,相信大家对vim都有所了解,可以去使用vim的终极终端spf13-vim,可以一键配置,非常的方便,其还有作品viper是一个完整的配置解决方案,支持JSON/YAML/TOML/HCL/envFile等配置文件,还可以热加载,配置保存等,hugo也是其的作品。
我们可以利用Cobra快速的去开发出我们想要的命令行工具,非常的方便快捷。
二 功能特性
- 简易的子命令行模式,如 app server, app fetch等等
- 完全兼容posix命令行模式
- 嵌套子命令subcommand
- 支持全局,局部,串联flags
- 使用Cobra很容易的生成应用程序和命令,使用cobra create appname和cobra add cmdname
- 如果命令输入错误,将提供智能建议,如 app srver,将提示srver没有,是否是app server
- 自动生成commands和flags的帮助信息
- 自动生成详细的help信息,如app help
- 自动识别-h,–help帮助flag
- 自动生成应用程序在bash下命令自动完成功能
- 自动生成应用程序的man手册
- 命令行别名
- 自定义help和usage信息
- 可选的紧密集成的viper apps
三 使用Cobra
3.1 安装
Cobra安装非常简单,可以使用go get获取即可,安装完成后,打开GOPATH目录,bin目录下应该有已经编译好的cobra,当然也可以使用源码编译安装。
在使用cobra之前需要了解三个概念,其也是命令行的三部分内容,command、flag和args
- 命令自身的一些基本信息,用command表示,具体对象是 cobra.Command
- 命令的一些标致或者选项,用flag表示,具体对象是 flag.FlagSet
- 最后的参数,用args表示,通常是[]string
对应如下例子:
1 | shell复制代码go get -u test.com/a/b |
这里get
就是commond(这里比较特殊), -u
就是flag, test.com/a/b
就是args
3.2 生成应用程序
1 | shell复制代码$ /Users/xuel/workspace/goworkspace/bin/cobra init --pkg-name smartant-cli |
3.3 设计cls程序
在smartant-cli 目录下创建imp目录,器重编写utils.go文件,内入如下
1 | go复制代码package utils |
- main.go
1 | go复制代码package main |
可以看出main函数执行cmd包,所以我们只需要在cmd包内调用utils包就能实现smartant-cli程序的需求。接着打开root.go文件查看:
- root.go
1 | go复制代码/* |
从源代码来看cmd包进行了一些初始化操作并提供了Execute接口。十分简单,其中viper是cobra集成的配置文件读取的库,这里不需要使用,我们可以注释掉(不注释可能生成的应用程序很大约10M,这里没哟用到最好是注释掉)。cobra的所有命令都是通过cobra.Command这个结构体实现的。为了实现smartant-cli功能,显然我们需要修改RootCmd。修改后的代码如下:
1 | go复制代码/* |
3.4 执行
1 | python复制代码# 编译 |
四 实现带有子命令的clis
在执行cobra.exe init demo之后,继续使用cobra为demo添加子命令test:
4.1 生成sysinfo子命令
1 | go复制代码$ /Users/xuel/workspace/goworkspace/bin/cobra add sysinfo |
4.2 查看子命令
1 | vbnet复制代码$ go build -o smartant-cli |
4.3 编写子命令
- sysinfo.go
1 | go复制代码/* |
- utils.go
1 | go复制代码package utils |
- 执行测试
1 | shell复制代码$ ./smartant-cli sysinfo |
五 其他
Cobra非常强大,能够帮助我们快速创建命令行工具,但是如果直接仅仅写一个非常简单的命令行工具,flag选项非常少,golang built-in的flag库够了。当然使用看个人选择,Cobra更适合复杂的命令行工具。
参考链接
- github.com/spf13/cobra
- www.huweihuang.com/golang-note…
- juejin.cn/post/692454…
- o-my-chenjian.com/2017/09/20/…
本文转载自: 掘金