cobra 2022 简明教程 - 8 个知识点快速上手

时间:2022-11-17 11:22:08

cobra 是命令行程序开发的辅助工具,官方源码在 ​​https://github.com/spf13/cobra​​ ,知名程序 k8s / github cli / hugo 均使用其开发,但由于网上大多数教程过时且繁琐,提炼 8 个知识点,帮助快速上手。


1 cobra 优势

cobra 2022 简明教程 - 8 个知识点快速上手

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,实现了快捷网购功能。

cobra 2022 简明教程 - 8 个知识点快速上手

但是这种口语化的表达对于 CLI 识别来说太多灵活,按照 cobra 的规范表示如下:

小五 买电影票 流浪地球 --数量=2 --时间=晚上七点 --影院=万达电影院

当然,命令也可以嵌套,比如我们把买电影票进行拆分,实现命令嵌套。

cobra 2022 简明教程 - 8 个知识点快速上手

按照 cobra 的规范表示如下:

小五 买 电影票 流浪地球 --数量=2 --时间=晚上七点 --影院=万达电影院

当然,我们还可以继续拆分,比如

小五 买 电影票 秒杀 流浪地球 --数量=2 --时间=晚上七点 --影院=万达电影院

所以 cobra 的 CLI 范式为

AppName Command1 Command2 ... CommandN --Flag1=x --Flag2=y ... --FlagN=z


3 cobra 实现

3.1 准备工作

安装 cobra 命令行工具(网上有很多教程都是使用 cobra ,过时了,应该使用 cobra-cli

go install github.com/spf13/cobra-cli@latest

建立工程目录

mkdir xiaowu
cd xiaowu
go mod init gitee.com/userabc/xiaowu

3.2 初始化

初始化工程

cobra-cli init

可以得到如下文件结构

cobra 2022 简明教程 - 8 个知识点快速上手

cobra 2022 简明教程 - 8 个知识点快速上手

cobra 2022 简明教程 - 8 个知识点快速上手

从以上命令可以看出,cobra 的核心对象是 cobra.Command,一切都围绕它展开。

定义时使用 Use 属性映射 Command Name,使用 Run 函数读取 Args。

定义完成后,使用该对象的 Flags 方法映射  flags。


3.3 增加命令

增加“买电影票”命令

cobra-cli command 买电影票

一个命令对应生成一个文件。

cobra 2022 简明教程 - 8 个知识点快速上手

cobra 2022 简明教程 - 8 个知识点快速上手

在 init 方法中注册为 rootCmd 的子命令,实现命令嵌套。

​rootCmd.AddCommand(买电影票Cmd)​


3.4 增加标志

增加数量、时间和电影院的 flags 定义。

cobra 2022 简明教程 - 8 个知识点快速上手

运行时不带 flags 结果如下。

cobra 2022 简明教程 - 8 个知识点快速上手

运行带 flags 结果如下。

cobra 2022 简明教程 - 8 个知识点快速上手

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 了。