零基础入门Cobra---kubernetes源码学习必备

零基础入门Cobra---kubernetes源码学习必备,第1张

Cobra 是用 go 语言实现的用于创建 CLI 应用程序和命令文件的工具。

许多 Go 的项目都是使用 Cobra 构建的,包括:

kubernetes

etcd

hugo

docker

……

本篇就来讲解一下 cobra 的使用,也为后续学习 kubernetes 做铺垫。

Cobra安装与初始化

首先新建一个目录,在目录中进行 go mod 初始化

go mod init cobra-demo

安装 cobra-cli (我使用的 go 版本是 1.18)

go install github.com/spf13/cobra-cli@latest

如果 go install 下载缓慢,可以进行如下修改进行加速

$ echo "export GO111MODULE=on" >> ~/.profile
$ echo "export GOPROXY=https://goproxy.cn" >> ~/.profile
$ source ~/.profile

然后就可以通过 cobra-cli 命令初始化一个 cobra 项目啦。

如果 go install 之后 cobra-cli 命令不可用,可以找到二进制文件的具体位置执行二进制文件,或添加 gopath 的环境变量。

cobra-cli init

这样我们就初始化好了一个 cobra 项目。

Cobra子命令

我们通过 vscode 打开项目文件,可以看到代码非常简洁。其中 main.go 文件就是去执行 cmd 的 execute 函数

而 cmd/root.go 中的 Execute 函数是去执行 rootCmd 的 execute

然后我们通过下面的命令,给 rootcmd 添加一个子命令 version

cobra-cli add version

可以看到项目里 cmd 目录下新增了 version.go 文件

这时我们可以发现每个 cmd 下的文件都是一个 cobra.Command ,其中都使用了几个参数。其中 use 就是每个命令的名称。

通过对里面的参数进行简单的修改,下面来了解一下每个参数的具体含义

var versionCmd = &cobra.Command{
  Use:   "version",
  Short: "版本信息",
  Long: `一个较长的带回车
  的
  版本信息`,
  Run: func(cmd *cobra.Command, args []string) {
    fmt.Println("version v0.0.1")
  },
}

执行 go build 生成可执行的二进制文件,执行 version 子命令

go build
cobra-demo version

我们发现子命令的输出就是 version.go 的 Run 函数的执行结果。执行 -h 可以打印 help

cobra-demo version -h

我们在 help 中发现 Long 参数的内容输出是子命令的 help 最上面的介绍文字。

而 Short 参数则是在上级命令的 help 里对子命令的简单介绍。

Cobra的Flags

我们用相同的方法生成两个子命令 cmd1、cmd2,然后修改 cmd/cmd2.go 的init函数。

func init() {
  cmd1Cmd.AddCommand(cmd2Cmd)
}

这样的话,就将 cmd2 变成了 cmd1 的子命令

我们将 cmd1 的 init 中注释给的两个例子取消注释。一个flag,一个PersistentFlags。

然后给 flag toggle 添加一个 MarkFlagRequired

func init() {
  rootCmd.AddCommand(cmd1Cmd)


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


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


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

Flags 就是 cmd1 命令的参数,在调用 cmd1 时可以在后面添加 --toggle 使用,也可以用 -t 缩写,参数类型是 Bool 类型,默认值为 false。

PersistentFlags 表示 cmd1 及其子命令都可以使用的参数。

MarkFlagRequired 表示必填参数

可以看到,cmd1 命令如果没有 --toggle 参数是无法执行的

并且 cmd1 和 cmd2 都可以使用 --foo 参数。

Cobra Run函数的执行顺序

Cobra 命令除了 Run 函数,还有其他几个函数,我们修改 rootCmd 的定义如下。

var rootCmd = &cobra.Command{
  Use:   "cobra-demo",
  Short: "A brief description of your application",
  Long: `A longer description`


  PersistentPreRun: func(cmd *cobra.Command, args []string) {
    fmt.Println("PersistentPreRun")
  },
  PreRun: func(cmd *cobra.Command, args []string) {
    fmt.Println("PreRun")
  },
  Run: func(cmd *cobra.Command, args []string) {
    fmt.Println("Run")
  },
  PostRun: func(cmd *cobra.Command, args []string) {
    fmt.Println("PostRun")
  },
  PersistentPostRun: func(cmd *cobra.Command, args []string) {
    fmt.Println("PersistentPostRun")
  },
}

根据命令执行的输出结果可以辨别出这几个函数的执行顺序。

PersistentPreRun ->  PreRun -> Run -> PostRun -> PersistentPostRun

其中 PersistentPreRun 和 PersistentPostRun 函数是当前命令及其子命令都会运行的函数。

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存