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

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

文章目录 golang常用库之-命令行工具 Cobra(眼镜蛇)一、spf13/cobra1. 项目作者 二、cobra1. Cobra提供的功能2. 概念3. 标志4. golang命令行库cobra的使用4.1 初始化 5. Cobra使用 demo6. 项目实战 其他参考

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 6. 项目实战

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

其他参考

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/989793.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存