Cobra 如何实现 SSH 风格的 -v、-vv、-vvv 重复标志?(CountVarP)
Cobra 如何实现 SSH 风格的 -v、-vv、-vvv 重复标志CountVarP【免费下载链接】cobraA Commander for modern Go CLI interactions项目地址: https://gitcode.com/GitHub_Trending/co/cobra给 Go 命令行程序加详细程度开关时通常希望用一个标志表达多个级别就像 SSH 的-v、-vv、-vvv一样。用 Cobra 库构建 CLI 时User Guide 的 Repeated Flags 小节给出了直接做法用CountVarP把一个int变量绑定到可重复的标志上每出现一次标志计数加 1然后在命令逻辑里按计数值分支。完成后的效果是myapp -v得到 1、myapp -vv得到 2、myapp -vvv得到 3。准备一个 Cobra 项目Cobra 应用的典型目录结构引自 User Guide▾ appName/ ▾ cmd/ add.go your.go commands.go here.go main.go在项目中安装并引入 Cobra 库引自 READMEgo get -u github.com/spf13/cobralatestimport github.com/spf13/cobramain.go保持极简只负责初始化package main import {pathToYourApp}/cmd func main() { cmd.Execute() }上面代码中的{pathToYourApp}是文档里的占位符替换成你自己应用的模块路径即go.mod里声明的 module 名例如你的模块叫example.com/myapp则写import example.com/myapp/cmd。根命令通常定义在app/cmd/root.go下面是 User Guide 中的文档示例Use、Short按你的应用自行填写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 https://gohugo.io/documentation/, Run: func(cmd *cobra.Command, args []string) { // Do Stuff Here }, }注册计数标志CountVarP在cmd包中声明一个int变量并在init()里用CountVarP注册引自 User Guide 的 Count Flags 小节var verbose int func init() { // CountVarP allows the flag to be repeated to increment the counter rootCmd.PersistentFlags().CountVarP(verbose, verbose, v, verbose output (can be repeated: -v, -vv, -vvv)) }四个参数依次是接收计数的int变量地址、长标志名verbose、短标志名v、帮助文本。这里注册在PersistentFlags()上而不是Flags()上——按 User Guide 的说法persistent flag 对其所在命令以及其下所有子命令都可用所以-v在任何子命令上都能使用如果只想让某一个子命令支持就注册到该子命令的 local flags 上User Guide 说明 local flag 只对该特定命令生效。在命令逻辑里按计数值分支文档给出的写法是在Run中用switch分发文档示例其中的log.SetLevel(log.InfoLevel)等调用是文档的示意写法文档未指定具体日志库换成你项目实际使用的日志配置即可Run: func(cmd *cobra.Command, args []string) { switch verbose { case 0: // Default: no verbose output case 1: // Info level logging log.SetLevel(log.InfoLevel) case 2: // Debug level logging log.SetLevel(log.DebugLevel) case 3: // Trace level logging log.SetLevel(log.TraceLevel) default: // Maximum verbosity log.SetLevel(log.TraceLevel) } },这个结构的关键点是verbose是一个普通的intCobra 只负责帮你累计出现次数具体每个级别做什么打日志、开调试输出、调整重试次数等完全由命令逻辑自己决定。运行与核对文档给出的对应关系文档示例myapp换成你的二进制名myapp -v→ verbose 1info levelmyapp -vv或myapp -v -v→ verbose 2debug levelmyapp -vvv或myapp -v -v -v→ verbose 3trace level注意-vv和-v -v是等价的两种写法计数结果都是 2。核对方式编译后分别用上面三种形式运行程序确认进入switch中对应的分支例如观察日志级别输出是否随之变化。注意事项与边界计数标志是重复次数语义。User Guide 的 Repeated Flags 小节还给了另一类重复标志StringArrayVarP/StringSliceVarP用于收集同一个标志的多个值如--input file1.txt --input file2.txt。那是多值需求不是多级别需求不要用来实现-v/-vv场景。文档说明CountVar与 array 类重复标志都依赖底层的 pflag 库对重复标志的支持本仓库的 go.mod 中模块声明为go 1.15并依赖github.com/spf13/pflag v1.0.9。文档示例中的级别命名info/debug/trace只是示例Cobra 本身不提供级别语义级别含义由你的程序定义。更多标志用法必选标志、标志互斥分组等可继续参考 User Guide 的 Working with Flags 部分。【免费下载链接】cobraA Commander for modern Go CLI interactions项目地址: https://gitcode.com/GitHub_Trending/co/cobra创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考