Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Cobra 快速入门

Cobra 快速入门

原创
作者头像
xcbeyond
修改于 2021-08-06 02:50:51
修改于 2021-08-06 02:50:51
70400
代码可运行
举报
文章被收录于专栏:技术那些事技术那些事
运行总次数:0
代码可运行

大家好!我是 xcbeyond, xcbeyond 就是我,大家也可以叫我超哥!本文首发于我的博客:Cobra 快速入门

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

1、Cobra 介绍

1.1 Cobra 概述

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

1.2 主要功能

Cobra 的主要功能如下:

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

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

1.3 应用举例

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

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

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

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

2、概念

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

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

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

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

比如下面的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# server是 commands,port 是 flag
hugo server --port=1313

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

再比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 及其相关依赖包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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>,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 程序目录结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.
├── cmd
│   ├── root.go
│   └── show.go
├── go.mod
├── go.sum
└── main.go
3.1.4 运行

执行命令 go run 运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 xcbeyond@xcbeyonddeMacBook-Pro cobra-demo % ../bin/cobra add show
 show created at /Users/xcbeyond/github/cobra-demo  

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

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

代码语言:go
AI代码解释
复制
// 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()`:

代码语言:go
AI代码解释
复制
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())
    },
 }

3. 修改 help 命令

help 命令有两个,一个是 short,一个是 lang,很明显 short 命令用来定义简短的说明,lang 命令用来定义详细说明,下面我们修改 show 命令的 help:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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())
    },
 }

4. 运行

执行 show 命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 xcbeyond@xcbeyonddeMacBook-Pro cobra-demo % go run main.go show
 2021-07-31 14:49:27.3582836 +0800 CST m=+0.176660901

执行 show --help 命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 只是简单的阐述了由几部分组成,在实际项目中要比这复杂的很多,一般都是拥有多个子命令,但核心内容都是类似的。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[Java]快速构建一个CLI小工具
在现实开发的过程中,大家会发现很多开源的框架都会有着自己的一个CLI工具库来帮助开发者们通过命令行的方式快速的达到某些目的,比如常见的docker 命令。那么在这篇文章当中,主要给大家介绍一个golang的小框架,我们可以借助这个框架来快速搭建一个小的CLI工具。
宇宙无敌暴龙战士之心悦大王
2023/03/29
1.4K0
Go通过cobra快速构建命令行应用
来自jetbrains Go 语言现状调查报告 显示:在go开发者中使用go开发实用小程序的比例为31%仅次于web,go得益于跨平台、无依赖的特性,用来编写命令行或系统管理这类小程序非常不错。
你大哥
2022/06/08
5140
Go通过cobra快速构建命令行应用
Go: 常用工具库cobra的简介与实践
来自jetbrains Go 语言现状调查报告 显示:在go开发者中使用go开发实用小程序的比例为31%仅次于web,go得益于跨平台、无依赖的特性,用来编写命令行或系统管理这类小程序非常不错。
Freedom123
2024/03/29
6390
Go: 常用工具库cobra的简介与实践
Cobra 使用简要(万字带你轻松上手 Cobra 使用)
欢迎阅读本文,本文将介绍如何使用 Go 语言中的 Cobra 库快速实现一个强大的命令行客户端。命令行客户端在软件开发中扮演着重要的角色,它们提供了一种简单而直接的方式来与应用程序进行交互,使用户能够轻松地执行各种操作。而 Cobra 则是一款流行的开源库,专门用于简化命令行应用程序的开发。
繁依Fanyi
2024/03/30
4.5K0
Cobra 使用简要(万字带你轻松上手 Cobra 使用)
Kubernetes 学习(九)Kubernetes 源码阅读之正式篇------核心组件之 Scheduler
0. 前言 继续上一篇博客阅读 Kubernetes 源码,参照《k8s 源码阅读》首先学习 Kubernetes 的一些核心组件,首先是 kube-scheduler 本文严重参考原文:《k8s 源码阅读》之 2.2 章节:scheduler,加入部分自己阅读的体会作为自己的阅读笔记 感谢《k8s 源码阅读》的作者们辛苦编写教材,在此郑重表示感谢,望大家多多支持!~ 1. 整体设计 1.1 概述 官网描述: The Kubernetes scheduler runs as a process alo
西凉风雷
2022/11/23
3560
Kubernetes 学习(九)Kubernetes 源码阅读之正式篇------核心组件之 Scheduler
命令行工具开发 cobra 示例
Cobra 是 Go 语言中一个流行的库,用于创建命令行应用程序。它提供了一个易于使用的框架,帮助开发者快速构建强大且灵活的 CLI(Command-Line Interface)工具。Cobra 的主要特点包括命令层次结构、命令行标志(flags)和参数处理、自动生成帮助文档等。
孟斯特
2024/08/10
1790
命令行工具开发 cobra 示例
cobra框架初探
cobra是一个命令行程序库,可以用来编写命令行程序,非常简单易用,类似于Go标准库中的Flag包,不过它比Flag包强大很多。它提供了一个脚手架,可以生成基于cobra的应用程序框架。
数据小冰
2022/08/15
9850
cobra框架初探
Go之现代命令行框架Cobra
老实说,今天是我第一次见到现代命令行框架这个名词,在此之前,我并不知道这个东西的作用是什么。下面一起来了解一下这个东西。
f1sh
2024/07/27
2700
Go每日一库之5:cobra
cobra是一个命令行程序库,可以用来编写命令行程序。同时,它也提供了一个脚手架,
luckpunk
2023/09/13
4480
要命!我篡改了系统命令惊现事故,竟要扣我年终奖-Golang-cobra
Kubernetes、Hugo、etcd 这些知名项目都用cobra来做命令行程序。学起来!
机智的程序员小熊
2023/03/02
3150
要命!我篡改了系统命令惊现事故,竟要扣我年终奖-Golang-cobra
Cobra 库上手—自建命令行工具
Cobra 是一个流行的 Go 语言库,用于创建强大且灵活的命令行应用程序。它由 spf13 开发,设计用于与 Go 生态系统中的其他流行库(如 Viper 配置库)无缝集成。Cobra 支持多级命令结构,允许定义根命令和任意数量的子命令,还可以轻松处理全局和本地标志。它自动生成帮助和使用信息,并支持 Bash、Zsh、Fish 和 PowerShell 的命令补全。此外,Cobra 能够生成 Markdown 格式的文档,使文档维护更加便捷。通过与 Viper 集成,Cobra 能处理配置文件和环境变量,为开发者提供了强大的工具集,使创建复杂的 Client 工具变得简单高效。Cobra 广泛应用于各种 Go 项目中,提升了 Client 应用的开发体验和维护效率。
FunTester
2025/01/23
1630
Cobra 库上手—自建命令行工具
go命令行库-cobra
Cobra 是一个用于创建强大的现代 CLI 应用程序的库。几乎包含了你所需要的所有元素。
zy010101
2022/10/31
9450
cobra-强大的CLI应用程序库
Cobra是一个用于创建强大的现代CLI应用程序的库,也是一个用于生成应用程序和命令文件的程序。
happlyfox
2021/02/24
7650
cobra-强大的CLI应用程序库
【K8s源码品读】002:Phase 1 - kubectl - create的调用逻辑
我们的目标是查看kubectl create -f nginx_pod.yaml 这个命令是怎么运行的。
junedayday
2021/08/05
5400
DevOpsCamp第2期:从 《cobra - 06 持久化命令》 开始聊聊 Go语言 指针类型的使用注意事项
嗯, 在 cobra 中提供了一种叫做 Persistent 的 状态, 定向支持 函数 与 参数。
老麦
2023/02/25
2960
DevOpsCamp第2期:从 《cobra - 06 持久化命令》 开始聊聊 Go语言 指针类型的使用注意事项
怎样上手cobra
cobra是go语言中一个非常强大的命令行构建工具,我们非常熟悉的docker、k8s、etcd都是基于cobra开发的。如果你想打造自己的命令行工具,那么cobra就是你的最佳选择。
闻说社
2024/06/11
1280
怎样上手cobra
golang 源码分析(17):cobra docker
然后创建DockerCli对象,DockerCli对象在cli/cli.go里声明。
golangLeetcode
2022/08/02
5260
使用 Cobra 创建 CLI 应用
虽然现在我们使用的大多数软件都是可视化的,很容易上手,但是这并不代表 CLI(命令行)应用就没有用武之地了,特别是对于开发人员来说,还是会经常和 CLI 应用打交道。而 Golang 就非常适合用来构建 CLI 应用,下面我们就将来介绍如何在 Golang 中构建一个 CLI 应用。
我是阳明
2020/06/15
1.5K0
go cobra CLI工具库的简单入门
下载:go install github.com/spf13/cobra-cli@latest
用户8478947
2023/01/26
1.1K0
Go 每日一库之 cli
cli是一个用于构建命令行程序的库。我们之前也介绍过一个用于构建命令行程序的库cobra。在功能上来说两者差不多,cobra的优势是提供了一个脚手架,方便开发。cli非常简洁,所有的初始化操作就是创建一个cli.App结构的对象。通过为对象的字段赋值来添加相应的功能。
用户7731323
2020/09/08
1.5K0
相关推荐
[Java]快速构建一个CLI小工具
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验