首页 > 编程语言 >Cobra 快速入门 - 专为命令行程序而生

Cobra 快速入门 - 专为命令行程序而生

时间:2023-04-21 22:08:17浏览次数:97  
标签:cobra 入门 show demo Cobra 命令 命令行 go


最近一直在看 Istio(一个 Service Mesh 框架)相关的东西,当看到其源码时发现了一个新东西 Cobra,一查却发现这是个好东西,用的地方可不少,比如:DockerKubernetes 等都有它的身影存在。为了更好的了解这些开源框架(如,IstioKubernetes 等),势必需要对 Cobra 做一个详细的了解,后续可能用到它的地方会很多。今天就 Cobra 做一个整体的介绍,让我们对它能有所认识,或许今后你的项目中也会用到它。

1、Cobra 介绍

1.1 Cobra 概述

Cobra 是一个 Golang 包,它提供了简单的接口来创建命令行程序。同时,Cobra 也是一个应用程序,用来生成应用框架,从而开发以 Cobra 为基础的应用。

Cobra 快速入门 - 专为命令行程序而生_Go

1.2 主要功能

Cobra 的主要功能如下:

  • 简易的子命令行模式,如 app server, app fetch 等等。
  • 完全兼容 posix 命令行模式。
  • 嵌套子命令 subcommand
  • 支持全局,局部,串联 flags
  • 使用 cobra 很容易生成应用程序和命令(cobra init appname 和 cobra add cmdname)。
  • 提供智能化的提示(如,输出 app srver 命令,将提示 你是要输入 app server 吗?)。
  • 自动生成 commands 和 flags 的帮助信息。
  • 自动生成详细的 help 信息,如 app -help
  • 自动识别帮助 flag、 -h--help
  • 自动生成应用程序在 bash 下命令自动完成功能。
  • 自动生成应用程序的 man 手册。
  • 命令行别名。
  • 自定义 help 和 usage 信息。
  • 可选的与 viper 的紧密集成。

对于命令行程序而言,上面这些功能简直就是量身打造。

1.3 应用举例

Cobra 被用于许多 Go 项目中,例如:KubernetesHugoGithub CLI等,更多广泛使用的项目有:

看了这些,一个字“赞”,两个字“优秀”!

了解了 Cobra 后,再去看这些 KubernetesetcdRegistry 等开源项目的代码时,也就大概知道如何去看了,这也就是我学习 Cobra 的目的。

2、概念

Cobra 是基于命令(commands)、参数(arguments )、选项(flags)而创建的。

在具体了解、使用Cobra前有一些概念需要提前知晓一下:命令(commands)、参数(arguments )、选项(flags)这几个概念。

  • commands:命令代表行为,一般表示 action,即运行的二进制命令服务。同时可以拥有子命令(children commands)
  • arguments:参数代表命令行参数。
  • flags:选项代表对命令行为的改变,即命令行选项。二进制命令的配置参数,可对应配置文件。参数可分为全局参数和子命令参数。

最好的命令行程序在实际使用时,就应该像在读一段优美的语句,能够更加直观的知道如何与用户进行交互。执行命令行程序应该遵循一般的格式: APPNAME VERB NOUN --ADJECTIVE 或 APPNAME COMMAND ARG --FLAG

比如下面的示例:

# server是 commands,port 是 flag
hugo server --port=1313

# clone 是 commands,URL 是 arguments,brae 是 flag
git clone URL --bare

再比如:

xcbeyond@xcbeyonddeMacBook-Pro ~ % docker info --help 

Usage:  docker info [OPTIONS]

Display system-wide information

Options:
  -f, --format string   Format the output using the given Go template

你没有看错,像 Docker 这种这么复杂的命令都是用 Cobra 是实现的,其必有过人之处,下一节就让我们一起来看看如何实现一套属于自己的命令行工具吧!

3、Cobra 实战

实战是最好的学习方式! 本节将从一个实战带你快速入门 Cobra。

3.1 环境准备

3.1.1 前提条件&环境

  • 操作系统:MacOS
  • Go 环境:go 1.16
  • Go 开发 IDE:VSCode

(上述环境可以个人环境而定,不做限制)

3.1.2 Cobra 安装

使用 go get 命令获取最新版本的 Cobra 库。下面命令将会安装 Cobra 及其相关依赖包:

go get -u github.com/spf13/cobra/cobra

下载安装完 Cobra 后,打开 GOPATH 目录,在 bin 目录下会下载好 cobra 程序(Window: cobra.exe, MacOS: cobra)。

3.1.3 工程初始化(Cobra 代码生成器)

假设现需要开发一个基于 Cobra 的 CLI 的命令行程序,命名为 cobra-demo

由于 Cobra 提供了代码生成器的功能,我们可以直接使用 Cobra 提供的初始化命令 cobra init 进行快速初始化创建 Cobra 工程。

切换到 GOPATH 目录(如,/Users/xcbeyond/github),执行命令 cobra init <name> --pkg-name <pkgname>,如下:

xcbeyond@xcbeyonddeMacBook-Pro github % .\bin\cobra init cobra-demo --pkg-name github.com/xcbeyond/cobra-demo
Your Cobra application is ready at
/Users/xcbeyond/github/cobra-demo

初始化成功后,cobra-demo 程序目录结构如下:

.
├── cmd
│   ├── root.go
│   └── show.go
├── go.mod
├── go.sum
└── main.go

3.1.4 运行

执行命令 go run 运行:

xcbeyond@xcbeyonddeMacBook-Pro cobra-demo % go run main.go
A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.

3.2 实战

这里以一个简单的 time 命令为例,实战讲解如何 Cobra 开发一个命令。

功能如下:

  • show:查看当前时间。
  • parse:指定时间格式 –format,parse 为 show 的子命令。

3.2.1 实现 show 命令(Command命令)

  1. 添加 show 命令
    通过命令 cobra add 添加 show 命令:
xcbeyond@xcbeyonddeMacBook-Pro cobra-demo % ../bin/cobra add show
show created at /Users/xcbeyond/github/cobra-demo

此时,项目目录下会创建一个 show.go 文件,在该文件中可完成命令的具体操作逻辑。

下面是 show.go 文件的初始代码:

// showCmd represents the show command
var showCmd = &cobra.Command{
    Use:   "show",
    Short: "A brief description of your command",
    Long: `A longer description that spans multiple lines and likely contains examples
and usage of using your command. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Println("show called")
    },
}

func init() {
    rootCmd.AddCommand(showCmd)

    // Here you will define your flags and configuration settings.

    // Cobra supports Persistent Flags which will work for this command
    // and all subcommands, e.g.:
    // showCmd.PersistentFlags().String("foo", "", "A help for foo")

    // Cobra supports local flags which will only run when this command
    // is called directly, e.g.:
    // showCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

&cobra.Command 作为命令的定义,其中有如下变量:

  • Use:用于指定具体的命令,如:show。
  • Short:命令的简短描述。
  • Long:命令的详细描述。
  • Run:命令执行入口,用于实现命令的具体处理逻辑。

rootCmd.AddCommand(showCmd) 命令的添加,将命令添加到根命令。(Cobra 支持命令的子命令)

  1. 实现显示当前时间逻辑
    在 &cobra.Command.Run 中添加获取当前时间逻辑 time.Now()
var showCmd = &cobra.Command{
    Use:   "show",
    Short: "A brief description of your command",
    Long: `A longer description that spans multiple lines and likely contains examples
and usage of using your command. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
    Run: func(cmd *cobra.Command, args []string) {
        // show current time
        fmt.Println(time.Now())
    },
}
  1. 修改 help 命令
    help 命令有两个,一个是 short,一个是 lang,很明显 short 命令用来定义简短的说明,lang 命令用来定义详细说明,下面我们修改 show 命令的 help:
var showCmd = &cobra.Command{
    Use:   "show",
    Short: "Displays the current time",
    Long: `You can use the time show command to view the current time. For example:

$ ./cobra-demo show
2021-03-19 14:34:20.9320241 +0800 CST m=+0.378845301`,
    Run: func(cmd *cobra.Command, args []string) {
        // show current time
        fmt.Println(time.Now())
    },
}
  1. 运行
    执行 show 命令:
xcbeyond@xcbeyonddeMacBook-Pro cobra-demo % go run main.go show
2021-07-31 14:49:27.3582836 +0800 CST m=+0.176660901

执行 show –help 命令:

xcbeyond@xcbeyonddeMacBook-Pro cobra-demo % go run main.go show --help
You can use the time show command to view the current time. For example:

$ ./cobra-demo show
2021-07-31 14:34:20.9320241 +0800 CST m=+0.378845301

Usage:
cobra-demo show [flags]

Flags:
-h, --help   help for show

Global Flags:
        --config string   config file (default is $HOME/.cobra-demo.yaml)

4、总结

Cobra-demo 只是简单的阐述了由几部分组成,在实际项目中要比这复杂的很多,一般都是拥有多个子命令,但核心内容都是类似的。

标签:cobra,入门,show,demo,Cobra,命令,命令行,go
From: https://blog.51cto.com/xcbeyond/6214223

相关文章

  • SVG 入门教程系列列表
     SVG入门教程系列列表:SVG教程(一)SVG教程(二)矩形SVG教程(三)圆形,椭圆,直线SVG教程(四)多边形,曲线,路径SVG教程(五)文本,Stroke属性,SVG滤镜,SVG模糊效果SVG教程(六)SVG阴影,SVG渐变–线性,SVG渐变-放射性SVG教程(七)SVG实例,SVG参考手册 更多参考:SVG动画入门SVG动画入门(二)SV......
  • 蓝牙Sig Mesh 概念入门③——分层结构Layered architecture
    文章目录一、Modellayer二、FoundationModellayer三、Accesslayer四、Transportlayer五、Networklayer六、Bearerlayer一、Modellayermodel定义了一个节点支持的功能特性,每一个model都定义了自己的opcode和status。比如genericonoffmodel,定义了GenericON/OFF/G......
  • 蓝牙Sig Mesh 概念入门②——网络角色
    文章目录一、前言二、Provisioner(配置节点)三、Proxy(代理节点)四、Node(普通节点)一、前言SigMesh组成了一个大网,里面有很多设备。包括协助设备入网的网关,终端的执行者节点,实际的控制者手机App等。他们分别作为什么角色,有着什么关系?二、Provisioner(配置节点)将未入网的设备引导入网的......
  • 【四二学堂】基于UiBot RPA开发入门---流程判断
    流程块一:dimaa=1Returna流程块二:TracePrint"a的值等于1时执行的模块"流程块三:TracePrint"a的值不等于1时执行的模块"......
  • 【四二学堂】基于UiBot RPA开发入门---Excel操作
    dimobjExcelWorkBook=""dimiRowsobjExcelWorkBook=Excel.OpenExcel(@res"测试数据一.xlsx",true,"Excel","","")iRows=Excel.GetRowsCount(objExcelWorkBook,"Sheet1")Excel.WriteRow(objExcelWorkBook,&......
  • (转)跟我一起学Go系列:日志系统从入门到晋级
    原文:https://zhuanlan.zhihu.com/p/361930459日志模块在如今的应用中地位是如日中天,开发者没有日志就相当于双目失明,对程序的运行状态无法判断。Go也不例外提供了基础的日志调用模块:log模块。log模块主要提供了3类接口,分别是“Print、Panic、Fatal”,下面一起看看基础日......
  • 【汇智学堂】Git使用入门之二
    现在,让我们在项目下创建一个新的README文件。如果之前并不存在这个文件,使用gitstatus命令,你将看到一个新的未跟踪文件:在状态报告中可以看到新建的README文件出现在Untrackedfiles下面。未跟踪的文件意味着Git在之前的快照(提交)中没有这些文件;Git不会自动将之纳入跟......
  • WCF教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介Windows通讯开发平台(WindowsCommunicationFoundation,简称WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows通讯开发平台。整合了原有的windows通讯的.netRemoting,WebService,Socket的机制,并融合有HTTP和FTP的相关技术。是Windows平台上开发分布......
  • JAVA入门第一天随记
    通过狂神第一天的课,对内容进行总结:一、关于markdown语法的学习1.对常用的语法进行总结1.标题2.字体斜体粗体粗斜体3.删除线无序列表2.快捷键Ctrl+Z:撤销Ctrl+X:剪切Ctrl+S:保存win+R:打开运行win+E:打开我的电脑3.打开CMD的方式1.Win+R输入cmd打开控......
  • JMeter入门教程(6) --脚本添加
    文章目录1.添加线程组2.添加HTTPCookie管理器3.添加HTTP请求默认值4.添加HTTP请求5.添加查看结果树1.添加线程组1.创建JMeter测试计划的第一步就是添加线程组测试元件。线程组会告诉JMeter需要模拟的并发用户数,以及并发用户发送请求的频率和数目。要添加线程组,首先选中测试计划,......