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

1、Cobra 介绍

1.1 Cobra 概述

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

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 项目中,例如:Kubernetes、Hugo和Github CLI等,更多广泛使用的项目有:

(来源于:https://github.com/spf13/cobra/blob/master/projects_using_cobra.md)

  • Arduino CLI
  • Bleve
  • CockroachDB
  • Cosmos SDK
  • Delve
  • Docker (distribution)
  • Etcd
  • Gardener
  • Giant Swarm’s gsctl
  • Git Bump
  • Github CLI
  • GitHub Labeler
  • Golangci-lint
  • GopherJS
  • Helm
  • Hugo
  • Istio
  • Kool
  • Kubernetes
  • Linkerd
  • Mattermost-server
  • Metal Stack CLI
  • Moby (former Docker)
  • Nanobox/Nanopack
  • OpenShift
  • Ory Hydra
  • Ory Kratos
  • Pouch
  • ProjectAtomic (enterprise)
  • Prototool
  • Random
  • Rclone
  • Skaffold
  • Tendermint
  • Twitch CLI
  • Werf

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

了解了 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 informationOptions:-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 支持命令的子命令)

  2. 实现显示当前时间逻辑

    在 &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 timefmt.Println(time.Now())},
    }
    
  3. 修改 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 timefmt.Println(time.Now())},
    }
    
  4. 运行

    执行 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.378845301Usage:
    cobra-demo show [flags]Flags:
    -h, --help   help for showGlobal Flags:--config string   config file (default is $HOME/.cobra-demo.yaml)
    

4、总结

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

Cobra 快速入门 - 专为命令行程序而生相关推荐

  1. 使用go的ssh包快速打造一个本地命令行ssh客户端

    2019独角兽企业重金招聘Python工程师标准>>> 热身运动? 在开始之前,先来个热身运动.虽然标题党写着快速打造一个ssh客户端,但是和跑步一样,在运动前还是需要先热身一下,不 ...

  2. 使用click创建完美的Python命令行程序

    Python程序员的主要工作是写命令行程序,即直接在终端运行的脚本. 随着项目规模增长,我们希望创建有效的命令行接口,通过提供不同的参数,解决不同的问题,而不是每次都修改源代码. Click库是一个非 ...

  3. Picocli-快速构建Java命令行程序

    相信每个Java程序员都曾使用过Scanner ,因编写出一个命令行程序而兴奋不已. 命令行程序也颇为实用,然而,使用Java来编写一个功能强大的命令行程序却并不容易,主要有以下几方面的痛点: 没有成 ...

  4. Java命令行程序构建工具airlift使用

    package com.ilucky.airlift;import java.util.Arrays;import io.airlift.airline.Cli; import io.airlift. ...

  5. linux 快速 命令快捷键,快速操作Linux终端命令行的快捷键列表

    快速操作Linux终端命令行的快捷键列表 在shell命令终端中,Ctrl+n相当于方向向下的方向键,Ctrl+p相当于方向向上的方向键. 在命令终端中通过它们或者方向键可以实现对历史命令的快速查找. ...

  6. 基于Golang的CLI 命令行程序开发

    基于Golang的CLI 命令行程序开发 [阅读时间:约15分钟] 一. CLI 命令行程序概述 二. 系统环境&项目介绍&开发准备 1.系统环境 2.项目介绍 3.开发准备 三.具体 ...

  7. 命令行程序增加 GUI 外壳

    Conmajia © 2012 Updated on Feb. 21, 2018 命令行大家都用过: 图 1 命令行程序工作界面 现在想办法为它做一个 GUI 外壳,实际效果参考图 2. 图 2 带 ...

  8. myapp——自动生成小学四则运算题目的命令行程序(侯国鑫 谢嘉帆)

    1.Github项目地址 https://github.com/baiyexing/myapp.git 2.功能要求 题目:实现一个自动生成小学四则运算题目的命令行程序 功能(已全部实现) 使用 -n ...

  9. python命令行大全-用什么库写 Python 命令行程序(示例代码详解)

    一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...

最新文章

  1. 单例模式 之 单例模式——饿汉模式
  2. C++操作windows注册列表
  3. MFC文件操作大全,打开,保存,复制,删除,查找等
  4. EFCore2.0@Xamarin.Forms
  5. oracle库存会计期无法打开,打开调整会计期出错!(有图)
  6. leetcode解题笔记-Summary Ranges
  7. ELK pipeline
  8. 这是不是微软MSN的一个Bug呢?
  9. 转载:技术文化和惨淡命运 —— 怀念中国雅虎
  10. 戴尔N5110装WIN10的体验
  11. 高通源代码 Ubuntu14.04下载编译Android(1)
  12. ubuntu20.04安装有道词典
  13. 简单修复360安全检测提示的发现robots文件漏洞
  14. 基于facades数据集的图像成任务,完成各种GAN的对比实验
  15. ABeam Recruiting | ABeam旗下艾宾信息技术开发(西安) 2023届校招资讯大放送
  16. CT图像之Hu值变换与窗宽窗位调整
  17. 普通高等学校毕业生就业工作暂行规定
  18. html5期末大作业——HTML+CSS公益关爱残疾人( 6个页面)
  19. hive sql中传date 指定后的“%Y-%m-%d“格式,需要加引号
  20. Platt SMO算法

热门文章

  1. CentOS7安装软件
  2. golang 向上取整小技巧
  3. Windows 11升级不了?来,我教你!
  4. oracle 排序后取中间的数据
  5. Windows菜单函数 - ModifyMenu/ModifyMenuBynum
  6. 原生渲染和webview渲染
  7. KeyPress 和KeyDown 、KeyPress之间的区别
  8. Mac下刻录启动U盘
  9. 这组漫画太扎心!快来看看,你中了几个?
  10. Camtasia 2023破解激活版免费下载附序列号激活码