cobra 是命令行程序开发的辅助工具,官方源码在 https://github.com/spf13/cobra ,知名程序 k8s / github cli / hugo 均使用其开发,但由于网上大多数教程过时且繁琐,提炼 8 个知识点,帮助快速上手。
1 cobra 优势
Cobra是一个库,提供一个简单的界面,可以创建类似于git & go工具的强大的现代CLI接口。
Cobra 提供:
- 基于子命令的简单CLI:
app server
、app fetch
等。 - 完全符合POSIX的标志(包括短版本和长版本)
- 嵌套子命令
- 全球、本地和级联标志
- 智能建议(
app srver
...你是说app server
吗?) - 命令和标志的自动帮助生成
- 分组帮助子命令
-
-h
、--help
等的自动帮助标志识别。 - 为您的应用程序自动生成shell自动完成(bash、zsh、fish、powershell)
- 为您的应用程序自动生成手册页
- 命令别名,这样你就可以在不破坏它们的情况下改变事物
- 定义您自己的帮助、用法等的灵活性。
- 可选与viper无缝集成,适用于12因素应用程序
最大的优势就是已经把 CLI 所需的辅助工作做完了,我们只需要写主要逻辑即可。
如果不明白前面这句话,那你需要使用一下上述知名工具,然后尝试编写一下 CLI 实际感受一下。
2 cobra 核心概念
2.1 核心概念
命令 commands: 说明做什么,动词或者名词,谓语
参数 arguments:说明被操作对象,名词,宾语
标志 flags:用于修饰命令,形容词或者名词或者量词等,状语
示例:APPNAME COMMAND ARG --FLAG
这里可以看到 APPNAME 是主语。
2.2 示例
假设我们开发了一个名叫“小五”的CLI,实现了快捷网购功能。
但是这种口语化的表达对于 CLI 识别来说太多灵活,按照 cobra 的规范表示如下:
当然,命令也可以嵌套,比如我们把买电影票进行拆分,实现命令嵌套。
按照 cobra 的规范表示如下:
当然,我们还可以继续拆分,比如
所以 cobra 的 CLI 范式为
3 cobra 实现
3.1 准备工作
安装 cobra 命令行工具(网上有很多教程都是使用 cobra ,过时了,应该使用 cobra-cli)
建立工程目录
3.2 初始化
初始化工程
可以得到如下文件结构
从以上命令可以看出,cobra 的核心对象是 cobra.Command,一切都围绕它展开。
定义时使用 Use 属性映射 Command Name,使用 Run 函数读取 Args。
定义完成后,使用该对象的 Flags 方法映射 flags。
3.3 增加命令
增加“买电影票”命令
一个命令对应生成一个文件。
在 init 方法中注册为 rootCmd 的子命令,实现命令嵌套。
rootCmd.AddCommand(买电影票Cmd)
3.4 增加标志
增加数量、时间和电影院的 flags 定义。
运行时不带 flags 结果如下。
运行带 flags 结果如下。
4 小结
两个 cli 方法 cobra-cli init
, cobra-cli command aabbcc
核心对象 cobra.Command
,主要属性 Use
,主要方法:Run
,读取 args
在 init
方法中实现
(1)命令嵌套 rootCmd.AddCommand(subCmd)
(2)Flags 解析 subCmd.Flags.StringVar(&stringValue, "flagName", ...)
只需要理解的知识点 8 个足以开发自己的 CLI 了。