Cobra CLI 学习笔记
Cobra 是 Go 的 CLI 框架。它包含一个用于创建强大的现代 CLI 应用程序的库,以及一个用于快速生成基于 Cobra 的应用程序和命令文件的工具。
官方文档: https://cobra.dev/
| go get -u github.com/spf13/cobra/cobra |
Cobra 常用参数解析#
| var rootCmd = &cobra.Command{ |
| Use: "", |
| Aliases: nil, |
| Short: "", |
| Long: "", |
| Example: "", |
| Args: nil, |
| Version: "", |
| PreRun: nil, |
| Run: nil, |
| PostRun: nil, |
| } |
参数验证#
位置参数:Args有以下几种验证方法
NoArgs
- 不允许有位置参数,如果存在位置参数,该命令将提示错误。
ArbitraryArgs
- 该命令将接受任何 args。
OnlyValidArgs
- 如果存在任何不在 字段中的位置参数,该命令将报告错误。ValidArgs``Command
MinimumNArgs(int)
- 指定位置参数的最小数量,如果没有至少 N 个位置参数,该命令将提示错误。
MaximumNArgs(int)
-指定位置参数的最大数量, 如果位置参数超过 N个,该命令将提示错误。
ExactArgs(int)
- 指定解析位置参数的数量,如果没有恰好 N 个位置参数,该命令将提示错误。
ExactValidArgs(int)
- 如果没有恰好 N 个位置参数,或者有任何位置参数不在 字段中,则该命令将报告并出错ValidArgs``Command
RangeArgs(min, max)
- 填写一个数值,且该数值介于 最小数量和最大数量之间,否则该命令将提示错误。
| package main |
| |
| import ( |
| "fmt" |
| "github.com/spf13/cobra" |
| ) |
| |
| var config string |
| var output string |
| |
| |
| var rootCmd = &cobra.Command{ |
| Use: "tools", |
| Short: "这是一个简单的描述", |
| Long: "这是一个详细的描述", |
| Run: func(cmd *cobra.Command, args []string) { |
| fmt.Println("这是一个Cobra示例", config) |
| }, |
| } |
| |
| |
| var echoCmd = &cobra.Command{ |
| Use: "echo", |
| Short: "输出当前服务信息", |
| Args: cobra.NoArgs, |
| Run: func(cmd *cobra.Command, args []string) { |
| fmt.Println("当前服务地址:http://127.0.0.0:8000") |
| }} |
| |
| |
| var initCmd = &cobra.Command{ |
| Use: "init <name>", |
| Short: "初始化一个指定服务的配置", |
| Args: cobra.ExactArgs(1), |
| Run: func(cmd *cobra.Command, args []string) { |
| name := args[0] |
| fmt.Println("开始执行初始化", name) |
| }, |
| } |
| |
| |
| var serverCmd = &cobra.Command{ |
| Use: "server", |
| Short: "获取服务列表", |
| } |
| |
| |
| var serverListCmd = &cobra.Command{ |
| Use: "ls", |
| Short: "获取服务列表", |
| Run: func(cmd *cobra.Command, args []string) { |
| fmt.Println("当前服务列表:\naa\nbb\ncc") |
| fmt.Println("将文件输出到", output) |
| }, |
| } |
| |
| |
| var serverGetCmd = &cobra.Command{ |
| Use: "get <name>", |
| Short: "获取具体服务信息", |
| Args: cobra.ExactArgs(1), |
| Run: func(cmd *cobra.Command, args []string) { |
| servername := args[0] |
| fmt.Println("获取服务信息:", servername) |
| }, |
| } |
| |
| |
| func initConfig() { |
| fmt.Println("运行初始化") |
| } |
| func main() { |
| |
| cobra.OnInitialize(initConfig) |
| |
| |
| rootCmd.AddCommand(echoCmd) |
| rootCmd.AddCommand(initCmd) |
| rootCmd.AddCommand(serverCmd) |
| |
| |
| serverCmd.AddCommand(serverListCmd) |
| serverCmd.AddCommand(serverGetCmd) |
| |
| |
| rootCmd.PersistentFlags().StringVar(&config, "config", "", "config file (default is $HOME/.firstappname.yaml)") |
| |
| |
| serverListCmd.Flags().StringVar(&output, "output", "", "输出文件") |
| serverGetCmd.Flags().StringVar(&output, "output", "", "输出文件") |
| |
| err := serverListCmd.MarkFlagRequired("output") |
| if err != nil { |
| return |
| } |
| |
| if err := rootCmd.Execute(); err != nil { |
| return |
| } |
| } |
| |
编译打包#
| go build -o main.exe main.go |
| D:\code_Go\cli_demo>main.exe -h |
| 这是一个详细的描述 |
| |
| Usage: |
| tools [flags] |
| tools [command] |
| |
| Available Commands: |
| completion Generate the autocompletion script for the specified shell |
| echo 输出当前服务信息 |
| help Help about any command |
| init 初始化一个指定服务的配置 |
| server 获取服务列表 |
| |
| Flags: |
| --config string config file (default is $HOME/.firstappname.yaml) |
| -h, --help help for tools |
| |
| Use "tools [command] --help" for more information about a command. |
| |
| D:\code_Go\cli_demo>main.exe echo |
| 运行初始化 |
| 当前服务地址:http://127.0.0.0:8000 |
| |
| D:\code_Go\cli_demo>main.exe init aaaa |
| 运行初始化 |
| 开始执行初始化 aaaa |
| |
| D:\code_Go\cli_demo>main.exe server ls --output=111 |
| 运行初始化 |
| 当前服务列表: |
| aa |
| bb |
| cc |
| 将文件输出到 111 |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!