golang常用库之-命令行工具 Cobra(眼镜蛇)

golang常用库之-命令行工具 Cobra(眼镜蛇)

一、spf13/cobra

spf13/cobra 和 urfave/cli 是Go的2个优秀命令行工具:

名称star仓库地址应用项目
spf13/cobra25.6khttps://github.com/spf13/cobradocker, kubernetes, istio, hugo …
urfave/cli17.5khttps://github.com/urfave/clidrone, peach, gogs …

1. 项目作者

spf13 前go团队成员,viper hugo 等等都是大牛spf13的作品。
大牛推特:https://twitter.com/spf13
https://github.com/spf13
在这里插入图片描述

二、cobra

https://cobra.dev/

美: [ˈkoʊbrə]
n. 眼镜蛇(毒蛇,分布于亚洲和非洲)

cobra是一种创建强大的现代CLI应用程序的库。

cobra用于许多GO项目,如Kubernetes,Hugo和Github Cli,以命名几个。此列表包含使用cobra的项目列表

Cobra既是一个用来创建强大的现代命令行应用的库,又是一个用来生成应用和命令文件的脚手架。
很多流行的Go项目都使用Cobra,例如Kubernetes, Hugo, rkt, etcd, Moby (former Docker), Docker (distribution), OpenShift, Delve, GopherJS, CockroachDB, Bleve, ProjectAtomic (enterprise), Giant Swarm’s gsctl, Nanobox/Nanopack, rclone, nehm, Pouch, Istio, Prototool, mattermost-server, Gardener, Linkerd等。

1. Cobra提供的功能

  • 简易的子命令行模式,如 app server, app fetch等等
  • 完全兼容posix命令行模式
  • 嵌套子命令subcommand
  • 支持全局,局部,串联flags
  • 使用Cobra很容易的生成应用程序和命令,使用cobra create appname 和cobra add cmdname
  • 如果命令输入错误,将提供智能建议,如 app srver,将提示srver没有,是否是app server
  • 自动生成commands和flags的帮助信息
  • 自动生成详细的help信息,如app help
  • 自动识别-h,–help帮助flag
  • 自动生成应用程序在bash下命令自动完成功能
  • 自动生成应用程序的man手册
  • 命令行别名
  • 自定义help和usage信息
  • 可选的紧密集成的viper apps

2. 概念

命令(Commands),参数(Args)和标识(Flags)是Cobra重要的三个概念。

  • 命令(Commands)代表动作
  • 参数(Args)代表事件
  • 标示(Flags)是对动作的修饰

Cobra基于三个基本概念commands,arguments和flags。其中commands代表行为,arguments代表数值,flags代表对行为的改变。

hugo server --port=1313
  • hugo:根命令
  • server:子命令
  • –port:标志

再看个带有参数的例子:

git clone URL --bare
  • git:根命令
  • clone:子命令
  • URL:参数,即 clone 作用的对象
  • –bare:标志

总结:
commands 代表行为
arguments 代表行为作用的对象
flags 是行为的修饰符

3. 标志

Cobra 中有两种标志:持久标志 ( Persistent Flags ) 和 本地标志 ( Local Flags ) 。

持久标志:指所有的 commands 都可以使用该标志。比如:–verbose ,–namespace
本地标志:指特定的 commands 才可以使用该标志。

全局的:

RootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra_exp1.yaml)")

局部的:

RootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")

区别就在 RootCmd 后面的是 Flags 还是 PersistentFlags

var rootCmd = &cobra.Command{
  Use:   "hugo",
  Short: "Hugo is a very fast static site generator",
  Long: `A Fast and Flexible Static Site Generator built with
                love by spf13 and friends in Go.
                Complete documentation is available at http://hugo.spf13.com`,
  Run: func(cmd *cobra.Command, args []string) {
    // Do Stuff Here
  },
}

func Execute() {
  if err := rootCmd.Execute(); err != nil {
    fmt.Println(err)
    os.Exit(1)
  }
}

4. golang命令行库cobra的使用

Golang之使用Cobra
参考URL: https://o-my-chenjian.com/2017/09/20/Using-Cobra-With-Golang/

Cobra 非常易用,首先使用 go get 命令安装最新版本。

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

下载完成后安装 cobra 工具,在 $GOPATH/bin 会生成可执行文件。

将生成的 cobra 工具放到 $PATH 目录下,可以看到:

[root@localhost ~]# cp -a $GOPATH/bin/cobra /usr/local/bin
[root@localhost ~]# cobra
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.

Usage:
  cobra [command]

Available Commands:
  add         Add a command to a Cobra Application
  help        Help about any command
  init        Initialize a Cobra Application

Flags:
  -a, --author string    author name for copyright attribution (default "YOUR NAME")
      --config string    config file (default is $HOME/.cobra.yaml)
  -h, --help             help for cobra
  -l, --license string   name of license for the project
      --viper            use Viper for configuration (default true)

Use "cobra [command] --help" for more information about a command.

在这里插入图片描述从截图上可以看到,输出的结果中主要包括三部分:Usage、Available Commands、Flags。其中 Usage 是告诉你该命令总的用法, Available Commands 告诉你有哪些子命令,Flags 则是告诉你可以用哪些参数。

总的来说,一个优秀的程序命令由三部分组成:主命令、子命令、参数。主命令是整个程序的入口,子命令是程序内各种主要的功能,参数则是告诉程序如何执行这些功能。

接下来我们初始化一个项目。

4.1 初始化

通过 cobra init 初始化 demo 项目:

[root@localhost ~]# cd $GOPATH/src 
[root@localhost src]# cobra init demo --pkg-name=demo
Your Cobra applicaton is ready at
/root/go/src/demo

当前项目结构为:

demo
├── cmd
│   └── root.go
├── LICENSE
└── main.go

可以看到初始化后的项目非常简单,主要是 main.go 和 root.go 文件。在编写代码之前,我们先分析下目前代码的逻辑。

代码分析
先查看下入口文件 main.go。代码逻辑很简单,就是调用 cmd 包里 Execute()函数:

package main

import "demo/cmd"

func main() {
  cmd.Execute()
}

再看下 root.go 中 rootCmd 的字段:

...

var rootCmd = &cobra.Command{
  Use:   "demo",
  Short: "A brief description of your application",
  Long: `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.`,
  // Uncomment the following line if your bare application
  // has an action associated with it:
  //    Run: func(cmd *cobra.Command, args []string) { },
}

// Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() {
  if err := rootCmd.Execute(); err != nil {
    fmt.Println(err)
    os.Exit(1)
  }
}

...

简单说明下:

  • Use:命令名
  • Short & Long:帮助信息的文字内容
  • Run:运行命令的逻辑

5. Cobra使用 demo

package main
import (
	"fmt"
	"github.com/spf13/cobra"
	"strings"
)

func main() {
	var cmdPull = &cobra.Command{
		Use:   "pull [OPTIONS] NAME[:TAG|@DIGEST]",
		Short: "Pull an image or a repository from a registry",
		Run: func(cmd *cobra.Command, args []string) {
			fmt.Println("Pull: " + strings.Join(args, " "))
		},
	}

	var rootCmd = &cobra.Command{Use: "docker"}
	rootCmd.AddCommand(cmdPull)
	rootCmd.Execute()
}

6. 项目实战

参考学习:
https://github.com/marmotedu/iam/blob/master/pkg/app/app.go

三、Cobra Command

基本上所有命令相关的功能都定义在Command结构体中, 使用cobar核心就是实例化这个结构体~

cmd := &cobra.Command{
	Use:   "echo",
}
//设置输出为标识输出
cmd.SetOut(os.Stdout)
cmd.Flags().SortFlags = false

其他参考

Golang之使用Cobra
参考URL: https://o-my-chenjian.com/2017/09/20/Using-Cobra-With-Golang/
cobra:生成解析命令行参数工具
参考URL: https://www.cnblogs.com/pxlsdz/p/15841231.html
Go 优秀库推荐 - 命令行工具 cobra
参考URL: https://juejin.cn/post/6844903828001652749
使用 Cobra 构建命令行工具
参考URL: https://blog.csdn.net/jiangyou0k/article/details/99854314

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值