Cobra 命令选项和参数实现详解

作者: adm 分类: go 发布时间: 2021-12-11 23:20

Cobra 支持两种选项,一种是命令自身的选项,另外一种是从父命令继承过来的选项。备注:因为西部数码的虚拟主机太垃圾,好多文字写进去被拦截了,有些地方中间加了空格

命令自身的选项可以通过函数 Flags 来添加,而继承过来的选项则是父命令通过 PersistentFlags 设置的选项。

我们之前看到过kubectl get命令,这个命令有很多的子命令,比如 pod、service、ingress 等。这里举个简单的例子如下:

kubectl -n devops get -o json -l ‘app=echo-go’ pods

上面的命令意思是获取 Labels 为app=echo-go的 Pod,其中命名空间是 devops,输出的内容格式为 JSON。

让我们仔细看下这个命令,其中 -n 选项是命令 kubectl 的选项,由于这个选项不仅仅提供给 get 命令使用,还可以提供给其它的诸如 describe 命令使用,所以将这个选项定义为全局的选项是合理的,这样每个子命令就不需要再定义一次了。所以这里 get 命令则需要继承这个选项来实现自己的功能。

另外 -o 选项定义输出的内容格式,-l 选项用来指定需要根据其值过滤的标签,这两个选项都是 get 命令自身的选项。

我们可以使用 kubectl options 命令来确认下 -n 确实是 kubectl 命令的全局选项,以及 -o 和 -l 确实是 get 命令的选项。

$ kubectl options

-n, –namespace=”: If present, the namespace scope for this CLI request

$ kubectl get -h

Usage:

kubectl get

[(-o|–output=)json|yaml|wide|custom-columns=…|custom-columns-file=…|go-template=…|go-template-file=…|jsonpath=…|jsonpath-file=…]

(TYPE [NAME | -l label] | TYPE/NAME …) [flags] [options]

另外在上面的命令中,我们还看到了参数 pods。在命令行应用中除了选项参数之外,剩下的参数都可以通过 Args 来获取。

好了,让我们用一个简单的实现来验证下这个过程。

在/home/yinzhong目录下新建cobra-command-parse.go文件并写入如下代码:

// /home/yinzhong/cobra-command-parse.go

package main

import (

"fmt"

"github.com/spf13/cobra"

)

var namespace string

func main() {

rootCmd := cobra.Command{

Use: "kubectl",

}

// 添加全局的选项,所有的子命令都可以继承

rootCmd.PersistentFlags().StringVarP(&namespace, "namespace", "n", "", "If present, the namespace scope for this CLI request")

// 一级子命令 get

var outputFormat string

var labelSelector string

getCmd := cobra.Command{

Use: "get",

Run: func(cmd *cobra.Command, args []string) {

fmt.Println("Print flags...")

fmt.Printf("Flags: namespace=[%s], selector=[%s], output=[%s]\n", namespace, labelSelector, outputFormat)

fmt.Println("Print args...")

for _, arg := range args {

fmt.Println("Arg:", arg)

}

},

}

// 添加命令选项,这些选项仅 get 命令可用

getCmd.Flags().StringVarP(&outputFormat, "output", "o", "", "Output format")

getCmd.Flags().StringVarP(&labelSelector, "selector", "l", "", "Selector (label query) to filter on")

// 组装命令

rootCmd.AddCommand(&getCmd)

// 执行命令

rootCmd.Ex ecute()

}

运行一下,验证下结果:

$ go build cobra-command-parse.go

$ ./cobra-command-parse -n devops get -o json -l app=echo-go pods echo-go-67986c999b-vbrtl

Print flags...

Flags: namespace=[devops], selector=[app=echo-go], output=[json]

Print args...

Arg: pods

Arg: echo-go-67986c999b-vbrtl

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!