京伦科技网站做的怎么样,成都最好的设计公司,阿里ace wordpress,网站开发需要哪些技术1.前言
打开k8s代码的时候#xff0c;我发现基本上那几个核心服务都是使用cobra库作为命令行处理的能力。因此#xff0c;为了对代码之后的代码学习的有比较深入的理解#xff0c;因此先基于这个库写个demo#xff0c;加深对这个库的一些理解吧
2.cobra库的基本简介
Git…
1.前言
打开k8s代码的时候我发现基本上那几个核心服务都是使用cobra库作为命令行处理的能力。因此为了对代码之后的代码学习的有比较深入的理解因此先基于这个库写个demo加深对这个库的一些理解吧
2.cobra库的基本简介
GithubGitHub - 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/cobralatest
3.2 命令行CLI工具
$ go install github.com/spf13/cobra-clilatest
因为我本身我的golang代码路径已经建好了bin目录因此执行完该命令后,如下 我们看到了cobra-cli的可执行文件。
这边是我们可以在命令用这个东西进行初始化了。集体步骤如下
xxxMBP src % mkdir greet
xxxMBP src % cd greet
xxxMBP test % ls
xxxMBP greet % cobra-cli init
Error: Please run go mod init MODNAME before cobra-cli init
xxxMBP greet % go mod init greet
go: creating new go.mod: module greet
xxxMBP greet % ls
go.mod
xxxMBP greet % cobra-cli init
Your Cobra application is ready at
/Users/XXX/workspace/golang/src/greet
xxxMBP greet % ls
LICENSE cmd go.mod go.sum main.go
xxxMBP 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的能力和价值