k8s学习之cobra命令库学习

1.前言

打开k8s代码的时候,我发现基本上那几个核心服务都是使用cobra库作为命令行处理的能力。因此,为了对代码之后的代码学习的有比较深入的理解,因此先基于这个库写个demo,加深对这个库的一些理解吧

2.cobra库的基本简介

Github:GitHub - spf13/cobra: A Commander for modern Go CLI interactions 在这里了,Cobra是一个用Go语言实现的命令行工具。并且现在正在被很多项目使用,例如:Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速的创建命令行工具,特别适合写 测试脚本,各种服务的 Admin CLI等。

因为命令行参数,golang本身自带了"flag" 库,使用flag库呢

flag.Parse()  
​
args := flag.Args()

解析完之后,需要每个命令去判断,十分的麻烦。

但是我们在使用到时候,需要针对命令行进行各种解析判断,但是有了这个库,我们就可以减少这段冗余的代码了

3 cobra的使用demo

话不多说,我们直接给出怎么用这个项目。我的环境是在macos上。

3.1 首先下载依赖库

命令行执行

go get -u github.com/spf13/cobra@latest
3.2 命令行CLI工具
$ go install github.com/spf13/cobra-cli@latest

因为我本身我的golang代码路径已经建好了bin目录,因此,执行完该命令后,如下

我们看到了cobra-cli的可执行文件。

这边是我们可以在命令用这个东西,进行初始化了。集体步骤如下

xxx@MBP src % mkdir greet
xxx@MBP src % cd greet
xxx@MBP test % ls
xxx@MBP greet % cobra-cli init
Error: Please run `go mod init <MODNAME>` before `cobra-cli init`
xxx@MBP greet % go mod init greet
go: creating new go.mod: module greet
xxx@MBP greet % ls
go.mod
xxx@MBP greet % cobra-cli init
Your Cobra application is ready at
/Users/XXX/workspace/golang/src/greet
xxx@MBP greet % ls
LICENSE cmd go.mod  go.sum  main.go
xxx@MBP greet %

第一步先建好一个test目录,然后执行go mod init test,然后再执行cobra-cli init的命令行,就会生成了脚手架文件了。

目录中会产生一下文件:

main.go cmd LICENSE go.mod go.sum
├── LICENSE
├── cmd
│   └── root.go
└── main.gogo.mod go.sum

3.3 编写代码文件

刚刚生成的文件,因为没有加具体的命令选项,可能用处不大,因此我们继续执行,添加一个命令字

cobra-cli add [command]

这样,他就会又生成了一个文件。

比如执行

cobra-cli add greet

// Package cmd /*
package cmd
​
import ("fmt"
​"github.com/spf13/cobra"
)
​
// greetCmd represents the greet command
var greetCmd = &cobra.Command{Use:   "greet",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) {// 这段代码是我加的。if len(args) < 1 {cmd.Help()return}name := args[0]fmt.Println("greet called:", name)},
}
​
func init() {rootCmd.AddCommand(greetCmd)
​// Here you will define your flags and configuration settings.
​// Cobra supports Persistent Flags which will work for this command// and all subcommands, e.g.:// greetCmd.PersistentFlags().String("foo", "", "A help for foo")
​// Cobra supports local flags which will only run when this command// is called directly, e.g.:greetCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}

因此,我们可以看到,新增了greet的命令。

然后我们编译一下,生成目标文件,后我们执行以下

./greetA 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.
​
Usage:greet [command]
​
Available Commands:completion  Generate the autocompletion script for the specified shellgreet       A brief description of your commandhelp        Help about any commandmockMsg     A brief description of your command
​
Flags:-h, --help     help for greet-t, --toggle   Help message for toggle
​
Use "greet [command] --help" for more information about a command.
​
 

以上我们通过返回的内容,可以看出多了一个gree的子命令。

并且可以加flag,比如-h

上边的Run 就可以放我们想要处理的业务逻辑了。

如果我们想增加一些flag 值,只需要能够在run里边添加如下代码即可

g, _ := cmd.Flags().GetInt32("goroutine")p, _ := cmd.Flags().GetInt32("packet")fmt.Println("mockmsg called,flags:g=", g, ",p=", p, ",args:", args)

比如我们实现如下:

Run: func(cmd *cobra.Command, args []string) {if len(args) < 1 {cmd.Help()return}name := args[0]fmt.Println("greet called:", name)
​g, _ := cmd.Flags().GetInt32("goroutine")p, _ := cmd.Flags().GetInt32("packet")fmt.Println("mockmsg called,flags:g=", g, ",p=", p, ",args:", args)},

这样,问可以这样使用了

./greet greet xx -p 10 -g 100
greet called: xx
greetCmd called,flags:g= 100 ,p= 10 ,args: [xx]
​

4 K8s中如何使用

我主要是看了kubctl模块的代码,我发现这个模块对cmd这块又进行了更丰富的封装,用以支持更加复杂的场景。

其中我们从kubectl的main开始

一个入口方法

// NewDefaultKubectlCommand creates the `kubectl` command with default arguments
func NewDefaultKubectlCommand() *cobra.Command {ioStreams := genericiooptions.IOStreams{In: os.Stdin, Out: os.Stdout, ErrOut: os.Stderr}return NewDefaultKubectlCommandWithArgs(KubectlOptions{PluginHandler: NewDefaultPluginHandler(plugin.ValidPluginFilenamePrefixes),Arguments:     os.Args,ConfigFlags:   defaultConfigFlags().WithWarningPrinter(ioStreams),IOStreams:     ioStreams,})
}

因为kubectl是可以对文件,以及flag进行处理使用的,因此,需要针对这种情况各种设置参数,我们发现已经充分利用了cmd结构体的内各个字段

其中 这两个方法是核心方法,基本上是初始化并赋值给command的结构了

// NewDefaultKubectlCommandWithArgs creates the `kubectl` command with arguments
func NewDefaultKubectlCommandWithArgs(o KubectlOptions) *cobra.Command {cmd := NewKubectlCommand(o)

其中在NewKubectlCommand 就是用来new cmd实例的。

func NewKubectlCommand(o KubectlOptions) *cobra.Command {warningHandler := rest.NewWarningWriter(o.IOStreams.ErrOut, rest.WarningWriterOptions{Deduplicate: true, Color: term.AllowsColorOutput(o.IOStreams.ErrOut)})warningsAsErrors := false// Parent command to which all subcommands are added.cmds := &cobra.Command{Use:   "kubectl",

这个就是 我么看到的kubectl的命令的使用地方了,因为本文主要是讲command的使用,因此k8s的其他get命令等先不赘述,下一篇在讲

下面是具体贴一下Command具体的相关的字段了意思了

以下是对 `Command` 结构体中每个字段的详细解释:
​
1. `Use`:这是一个字符串,用于描述命令的基本使用方式。它规定了命令所需的参数和可选参数的格式,为用户提供了简洁明了的使用指导。- 例如:`"add [-F file | -D dir]... [-f format] profile"` 表示 `add` 命令可以有可选的 `-F` 和 `-D` 参数,其中 `-F` 后跟一个文件,`-D` 后跟一个目录,这两个参数是互斥的,并且可以多次出现,还有一个可选的 `-f` 参数后跟格式信息,最后需要一个 `profile` 参数。
​
2. `Aliases`:一个字符串切片,存储了该命令的别名。这使得用户可以通过不同的名称来调用同一个命令,增加了命令使用的灵活性。- 比如:`["add_item", "insert"]` 是 `add` 命令的别名。
​
3. `SuggestFor`:也是一个字符串切片,其中包含了此命令可能被建议替代的其他命令名称。这有助于在用户输入类似但不完全准确的命令时提供相关的建议。
​
4. `Short`:一个简短的字符串,用于在帮助输出中提供命令的简短描述,让用户快速了解命令的主要功能。- 例如:"添加新的项目"
​
5. `GroupID`:指定该子命令在其父命令的“帮助”输出中所属的组标识,便于对命令进行分组展示和管理。
​
6. `Long`:详细的长字符串,在“帮助 <此命令>”输出中提供更全面和深入的命令描述,包括更多的功能细节、使用示例、注意事项等。
​
7. `Example`:包含命令使用的示例字符串,通过实际的例子帮助用户更好地理解如何正确使用该命令。
​
8. `ValidArgs`:一个字符串切片,列出了在外壳自动补全中所有有效的非标志参数。
​
9. `ValidArgsFunction`:一个函数,动态地提供有效的非标志参数用于外壳自动补全,是一种更灵活的参数提供方式。
​
10. `Args`:定义了预期的参数的相关规则和处理方式。
​
11. `ArgAliases`:一个字符串切片,列出了有效参数的别名,这些别名不会在外壳自动补全中被提示,但手动输入时会被接受。
​
12. `BashCompletionFunction`:用于传统 Bash 自动补全生成器的自定义 Bash 函数,为特定的 Bash 环境提供定制的自动补全功能。
​
13. `Deprecated`:如果命令已被弃用,存储了使用该命令时将显示的提示信息,告知用户该命令不应再被使用。
​
14. `Annotations`:一个键值对映射,允许应用程序为命令添加自定义的标识、分组或特殊选项等元数据。
​
15. `Version`:存储命令的版本信息,用于版本控制和显示。
​
16. 各种 `Run` 函数:- `PersistentPreRun` 和 `PersistentPreRunE`:在命令执行前被调用,且子命令会继承并执行,用于进行一些持久的预处理操作。- `PreRun` 和 `PreRunE`:在命令执行前被调用,但子命令不会继承,用于特定于当前命令的预处理。- `Run` 和 `RunE`:实际的工作函数,实现命令的主要逻辑。- `PostRun` 和 `PostRunE`:在 `Run` 函数执行后被调用,用于进行后续的处理操作。
​
17. `commandgroups`:一个指针切片,指向子命令所属的组对象。
​
18. `args`:实际从标志解析得到的参数切片。
​
19. `flagErrorBuf`:一个字节缓冲区,用于存储来自 `pflag` 的错误消息。
​
20. `flags`:一个 `flag.FlagSet` 对象,包含了所有的标志。
​
21. `pflags`:存储持久的标志。
​
22. `lflags`:本地标志的缓存,用于优化 `LocalFlags` 函数调用。
​
23. `iflags`:继承的标志的缓存,用于优化相关函数调用。
​
24. `parentsPflags`:父命令的所有持久标志。
​
25. `globNormFunc`:一个全局的标准化函数,用于处理标志名称的标准化。
​
26. `usageFunc`:用户定义的使用函数,用于自定义命令的使用说明。
​
27. `usageTemplate`:用户定义的使用模板。
​
28. `flagErrorFunc`:用户定义的标志错误处理函数。
​
29. `helpTemplate`:用户定义的帮助模板。
​
30. `helpFunc`:用户定义的帮助函数。
​
31. `helpCommand`:具有“帮助”用途的命令,如果用户未定义,则使用默认的帮助命令。
​
32. `helpCommandGroupID`:帮助命令所属的组标识。
​
33. `completionCommandGroupID`:自动完成命令所属的组标识。
​
34. `versionTemplate`:用户定义的版本模板。
​
35. `errPrefix`:用户定义的错误消息前缀。
​
36. `inReader`:用户定义的输入读取器,替代标准输入。
​
37. `outWriter`:用户定义的输出写入器,替代标准输出。
​
38. `errWriter`:用户定义的错误输出写入器,替代标准错误输出。
​
39. `FParseErrWhitelist`:要忽略的标志解析错误的列表。
​
40. `CompletionOptions`:用于控制外壳自动完成的选项。
​
41. `commandsAreSorted`:一个布尔值,指示命令切片是否已排序。
​
42. `commandCalledAs`:一个结构体,记录命令被调用时的名称和是否被调用的状态。
​
43. `ctx`:上下文对象,用于传递和管理命令执行的上下文信息。
​
44. `commands`:一个指针切片,包含此命令支持的子命令。
​
45. `parent`:指向该命令的父命令的指针。
​
46. `Max lengths` 相关字段:记录命令相关字符串的最大长度,用于格式化和展示。
​
47. `TraverseChildren`:一个布尔值,决定是否在执行子命令之前解析所有父命令的标志。
​
48. `Hidden`:如果为真,该命令将在可用命令列表中隐藏,不向用户显示。
​
49. `SilenceErrors`:一个布尔值,用于控制是否静默处理错误。
​
50. `SilenceUsage`:一个布尔值,用于控制在发生错误时是否静默使用信息。
​
51. `DisableFlagParsing`:如果为真,将禁用标志解析,所有标志将作为参数传递给命令。
​
52. `DisableAutoGenTag`:如果为真,在生成文档时将禁用自动生成的标签。
​
53. `DisableFlagsInUseLine`:如果为真,将在使用行中禁用标志的添加。
​
54. `DisableSuggestions`:如果为真,将禁用基于编辑距离的建议功能。
​
55. `SuggestionsMinimumDistance`:定义显示建议的最小编辑距离,必须大于 0 。

5 总结

本篇文章主要是一步步的吧cobra这个库如何使用等进行了详细的解释,我们在使用这个库的时候,比较能够理解他工作的原理,然后再根据具体的k8s如何使用以及具体字段的使用来充分发挥cmd的能力和价值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/373938.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

反向散射技术(backscatter communication)

智能反射表面辅助的反向散射通信系统研究综述&#xff08;知网&#xff09; 1 反向散射通信技术优势和应用场景 反向散射通信技术通过被动射频技术发送信号,不需要一定配有主动射频单元,被认为是构建绿色节能、低成本、可灵活部署的未来物联网规模化应用关键技术之一,是实现“…

通过Arcgis从逐月平均气温数据中提取并计算年平均气温

通过Arcgis快速将逐月平均气温数据生成年平均气温数据。本次用2020年逐月平均气温数据操作说明。 一、准备工作 &#xff08;1&#xff09;准备Arcmap桌面软件&#xff1b; &#xff08;2&#xff09;准备2020年逐月平均气温数据&#xff08;NC格式&#xff09;、范围图层数据&…

添加点击跳转页面,优化登录和注册页路由

一、给注销按钮添加点击跳转至登录页 1、在路由中添加登录页路由 2、自定义登录页面 3、在app.vue页面找到下拉框组件&#xff0c;添加点击事件 4、使用vue-router中的useRoute和useRouter 点击后可以跳转&#xff0c;但是还存在问题&#xff0c;路径这里如果我们需要更改登录…

如何在 PostgreSQL 中确保数据的异地备份安全性?

文章目录 一、备份策略1. 全量备份与增量备份相结合2. 定义合理的备份周期3. 选择合适的备份时间 二、加密备份数据1. 使用 PostgreSQL 的内置加密功能2. 使用第三方加密工具 三、安全的传输方式1. SSH 隧道2. SFTP3. VPN 连接 四、异地存储的安全性1. 云存储服务2. 内部存储设…

Win10安装MongoDB(详细版)

文章目录 1、安装MongoDB Server1.1. 下载1.2. 安装 2、手动安装MongoDB Compass(GUI可视工具)2.1. 下载2.2.安装 3、测试连接3.1.MongoDB Compass 连接3.2.使用Navicat连接 1、安装MongoDB Server 1.1. 下载 官网下载地址 https://www.mongodb.com/try/download/community …

文件加密软件推荐|2024这3款性价比高口碑公认

李明&#xff08;信息安全专家&#xff09;&#xff1a;“最近&#xff0c;国内发生了一起严重的国家机密泄密事件&#xff0c;真是让人痛心疾首。 这种泄密不仅威胁到国家安全&#xff0c;还可能引发一系列连锁反应&#xff0c;比如经济损失、社会信任度下降等。你们知道吗&a…

DELTA: DEGRADATION-FREE FULLY TEST-TIME ADAPTATION--论文笔记

论文笔记 资料 1.代码地址 2.论文地址 https://arxiv.org/abs/2301.13018 3.数据集地址 https://github.com/bwbwzhao/DELTA 论文摘要的翻译 完全测试时间自适应旨在使预训练模型在实时推理过程中适应测试数据流&#xff0c;当测试数据分布与训练数据分布不同时&#x…

JavaWeb__XML、http

目录 一 、XML1.1 常见配置文件类型1.1.1 properties配置文件1.1.2 xml配置文件 1.2 DOM4J进行XML解析1.2.1 DOM4J的使用步骤1.2.2 DOM4J的API介绍 二、 HTTP协议2.1 HTTP简介2.2 请求和响应报文2.2.1 报文的格式2.2.2 请求报文2.2.3 响应报文 一 、XML XML是EXtensible Markup…

首批!蚂蚁数科通过中国信通院面向大模型的可信执行环境产品专项测试

2024年6月17日&#xff0c;在中国信息通信研究院&#xff08;以下简称“信通院”&#xff09;组织的首批“面向大模型的增强型可信执行环境基础能力专项测试”中&#xff0c;蚂蚁数科摩斯顺利完成全部测试内容&#xff0c;成为首批完成此项测试的组织。 标准及测试介绍 《面向…

数据结构1:C++实现变长数组

数组作为线性表的一种&#xff0c;具有内存连续这一特点&#xff0c;可以通过下标访问元素&#xff0c;并且下标访问的时间复杂的是O(1)&#xff0c;在数组的末尾插入和删除元素的时间复杂度同样是O(1)&#xff0c;我们使用C实现一个简单的边长数组。 数据结构定义 class Arr…

【测试设计】使用jenkins 插件Allure生成自动化测试报告

前言 以前做自动化测试的时候一直用的HTMLTestRunner来生成测试报告&#xff0c;后来也尝试过用Python的PyH模块自己构建测试报告&#xff0c;在后来看到了RobotFramework的测试报告&#xff0c;感觉之前用的测试报告都太简陋&#xff0c;它才是测试报告应该有的样子。也就是在…

C++基础篇(1)

目录 前言 1.第一个C程序 2.命名空间 2.1概念理解 2.2namespace 的价值 2.3 namespace的定义 3.命名空间的使用 4.C的输入输出 结束语 前言 本节我们将正式进入C基础的学习&#xff0c;话不多说&#xff0c;直接上货&#xff01;&#xff01;&#xff01; 1.第一个C程…

关于复现StableDiffusion相关项目时踩坑的记录

研究文生图也有了一段时间&#xff0c;复现的论文也算是不少&#xff0c;这篇博客主要记录我自己踩的坑。 目前实现文生图的项目主要分为两类&#xff1a; 一、基于Stable-diffusion原项目文件实现 原项目地址&#xff1a;https://github.com/Stability-AI/stablediffusion …

Android实现获取本机手机号码

和上次获取设备序列号一样&#xff0c;仍然是通过无障碍服务实现&#xff0c;在之前的代码基础上做了更新。代码和demo如下&#xff1a; package com.zwxuf.lib.devicehelper;import android.accessibilityservice.AccessibilityService; import android.app.Activity; import…

Everything搜索无法搜索到桌面的文件(无法检索C盘 或 特定路径的文件)

现象描述 在Everything搜索框中输入桌面已存在的文件或随便已知位置的文件&#xff0c;无法找到。 搜索时检索结果中明显缺少部分磁盘位置的&#xff0c;例如无法检索C盘&#xff0c;任意关键字搜索时结果中没有位于C盘的&#xff0c;无论怎样都搜不到C盘文件。 解决方法 在…

Flutter——最详细(Table)网格、表格组件使用教程

背景 用于展示表格组件&#xff0c;可指定线宽、列宽、文字方向等属性 属性作用columnWidths列的宽度defaultVerticalAlignment网格内部组件摆放方向border网格样式修改children表格里面的组件textDirection文本排序方向 import package:flutter/material.dart;class CustomTa…

还没听说过IOC你就out了!融合IOC的可视化大屏重塑校园管理模式

一.IOC到底是个啥东西 在数字孪生中&#xff0c;IOC&#xff08;物联网操作中心&#xff09;是指一个中心化的平台或系统&#xff0c;用于监控、管理和控制物联网设备和系统。在智慧校园建设中用于集成、管理和优化校园各类数据和资源的中心化平台。它通常采用先进的信息技术和…

防火墙之安全策略

目录 前言&#xff1a; 一、实验需求 二、需求分析 三、具体操作 1&#xff0c;在安全区域中新建拓扑图中所显示的区域 2&#xff0c;在对象模块中的时间段中添加一个9&#xff1a;00-18&#xff1a;00 3&#xff0c;写两条安全策略&#xff0c;一个是生产区&#xff0c…

解决Invalid or unsupported by client SCRAM mechanisms(dbeaver)

在用工具&#xff08;dbeaver&#xff09;链接Opengauss数据库的时候&#xff0c;报出标题的错误。原因为驱动不正确。 驱动下载地址&#xff1a;https://opengauss.org/zh/download/ 下载完的包 &#xff0c;解压后&#xff0c;里面应该有两个jar 包,使用postgresql.jar dbe…

AWS 云安全性:检测 SSH 暴力攻击

由于开源、低成本、可靠性和灵活性等优势&#xff0c;云基础设施主要由基于linux的机器主导&#xff0c;然而&#xff0c;它们也不能幸免于黑客的攻击&#xff0c;从而影响云的安全性。攻击Linux机器最流行的方法之一是通过SSH通道。 什么是 SSH 安全外壳协议&#xff08;Sec…