首页 > 其他分享 >cobra 2022 简明教程 - 8 个知识点快速上手

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

时间:2022-11-17 22:34:03浏览次数:78  
标签:知识点 cobra cli 电影票 -- 命令 2022 CLI

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


1 cobra 优势

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

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_02

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

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

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

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

按照 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 个知识点快速上手_tutorial_04

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

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

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

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

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


3.3 增加命令

增加“买电影票”命令

cobra-cli command 买电影票

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

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

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

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

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


3.4 增加标志

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

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

运行时不带 flags 结果如下。

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

运行带 flags 结果如下。

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

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


标签:知识点,cobra,cli,电影票,--,命令,2022,CLI
From: https://blog.51cto.com/u_13556371/5858326

相关文章

  • 2022.11.17
    ###noip模拟暴力都好高明啊,感觉又是除了暴力无甚可讲的一天。。。##出错点t4:又犯老毛病,长一点复杂一点就读不懂,没写暴力,然而这题暴力分给得很足。。。##过程分析......
  • 【C++】如果你准备学习C++,并且有C语言的基础,我希望你能简单的过一遍知识点。
    相关视频——黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili(1-83)我的小站——半生瓜のblog我知道这个视频早已经被很多人学习并且记录​笔记,......
  • 2022年11月系统架构设计师考试知识点分布
    2022年11月系统架构设计师考试知识点分布薛大龙 邹月平施游 1、上午知识点分布表1是按题号对应的考试内容。表1按试题号分布的考查内容试题号知识点试题号知识点1云计......
  • 2022NOIP A层联测29 A B C D(特殊数列 数进制数 最短路之和 一笔画)
    T1[状态压缩DP]给出\(n,m,p,q,r\),求长度是n,值域在\([1,m]\)之间的序列个数,满足\(\exists1\leqx<y<z<k\leqn,\)\(sum(x,y-1)=p,sum(y,z-1)=q,sum(z,k)=r\).(n<=50,max(p......
  • 2022-2023-1 20221420《计算机基础与程序设计》第十二周学习总结
    作业信息这个作业属于哪个课程:这个作业的要求在:2022-2023-1《计算机基础与程序设计》教学进程-娄老师-博客园(cnblogs.com)这个作业的目标:《C语言程序设计》第......
  • 【2022-11-17】luffy项目实战(十)
    一、课程主页之课程表分析1.1课程表分析#课程类型免费课实战课:Python7天入门,django从入门到精通轻课:整一套课程的线上内容,线上+线下结合价格更高......
  • 2022.11.17模拟赛题解
    从今天起更换码风。猜数字两种做法:二分,哈希二分记函数\(g(x)\)表示数字\(x\)在\(10\)进制下的位数。可以观察到对于正整数\(k(k\ge2)\),都有\(g(k^k)<g((k+1)......
  • 数据库相关知识点整理,助力拿到心仪的offer
    1.数据库的事务1.1什么是数据库事务?事务是指一组逻辑上相关的操作,这些操作要么全部完成,要么全部不完成。事务是数据库管理系统执行过程中的一个逻辑工作单位,是用户定......
  • 2022.11.17 Java 面向对象的介绍
    属性+方法=类面向过程与面向对象不可分割,面向对象是由一个个面向过程组成,就像教育部由一个个老师组成。面向对象的本质:以类的方式组织代码,以对象的形式组织(封装)数据;......
  • 【补题】The 2022 SDUT Summer Trials
    比赛链接The2022SDUTSummerTrialsA.Ginger'snumber样例恶臭(恼)签到题简单分解因数就会发现要求的就是\(gcd\),直接算即可,时间复杂度\(\Theta(Tlog(max(x,y)))\)......