Cobra 是 Go 的 CLI 框架。它包含一个用于创建功能强大的现代 CLI 应用程序的库,以及一个用于快速生成基于 Cobra 的应用程序和命令文件的工具。
Cobra 由 Go 项目成员和 hugo 作者 spf13 创建,已经被许多流行的 Go 项目采用,比如 GitHub CLIDocker CLI
DockerKubernetes、go-zero、kratos 等都有它的身影存在,一句话:只要你想写命令行使用cobra就够了。

主要功能

Cobra 的主要功能如下:

  • 简易的子命令行模式,如 app serverapp fetch 等等。
  • 完全兼容 posix 命令行模式。
  • 嵌套子命令 subcommand
  • 支持全局,局部,串联 flags
  • 使用 cobra 很容易生成应用程序和命令(cobra init appnamecobra add cmdname)。
  • 提供智能化的提示(如,输出 app srver 命令,将提示 你是要输入 app server 吗?)。
  • 自动生成 commandsflags 的帮助信息。
  • 自动生成详细的 help 信息,如 app -help
  • 自动识别帮助 flag-h--help
  • 自动生成应用程序在 bash 下命令自动完成功能。
  • 自动生成应用程序的 man 手册。
  • 命令行别名。
  • 自定义 helpusage 信息。
  • 可选的与 [viper](http://github.com/spf13/viper) 的紧密集成。

概念

Cobra 是基于命令(commands)、参数(arguments )、选项(flags)而创建的。

在具体了解、使用Cobra前有一些概念需要提前知晓一下:命令(commands)、参数(arguments )、选项(flags)这几个概念。

  • commands:命令代表行为,一般表示 action,即运行的二进制命令服务。同时可以拥有子命令(children commands)
  • arguments:参数代表命令行参数。
  • flags:选项代表对命令行为的改变,即命令行选项。二进制命令的配置参数,可对应配置文件。参数可分为全局参数和子命令参数。

最好的命令行程序在实际使用时,就应该像在读一段优美的语句,能够更加直观的知道如何与用户进行交互。执行命令行程序应该遵循一般的格式: APPNAME VERB NOUN --ADJECTIVEAPPNAME COMMAND ARG --FLAG

比如下面的示例:

  1. # server是 commands,port 是 flag
  2. hugo server --port=1313
  3. # clone 是 commands,URL 是 arguments,brae 是 flag
  4. git clone URL --bare

你没有看错,像 Docker 这种这么复杂的命令都是用 Cobra 是实现的,其必有过人之处,下一节就让我们一起来看看如何实现一套属于自己的命令行工具吧!

安装

使用 go get 命令获取最新版本的 Cobra 库。下面命令将会安装 Cobra 及其相关依赖包:

  1. go get -u github.com/spf13/cobra@latest
  2. go install github.com/spf13/cobra-cli@latest //可选

如果不使用cobra

  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. )
  6. func main() {
  7. flag.Parse()
  8. args := flag.Args()
  9. if len(args) <= 0 {
  10. fmt.Println("Usage: admin-cli [command]")
  11. return
  12. }
  13. switch args[0] {
  14. case "help":
  15. // ...
  16. case "export":
  17. //...
  18. if len(args) == 3 { // 导出到文件
  19. // todo
  20. } else if len(args) == 2 { // 导出...
  21. // todo
  22. }
  23. default:
  24. //...
  25. }
  26. }

使用cobra解决

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/spf13/cobra"
  5. "os"
  6. )
  7. // rootCmd represents the base command when called without any subcommands
  8. var rootCmd = &cobra.Command{
  9. Use: "api",
  10. Short: "A brief description of your application",
  11. Long: `A longer description `,
  12. }
  13. // 命令一
  14. var mockMsgCmd = &cobra.Command{
  15. Use: "mockMsg",
  16. Short: "批量发送测试文本消息",
  17. Long: ``,
  18. Run: func(cmd *cobra.Command, args []string) {
  19. fmt.Println("mockMsg called")
  20. },
  21. }
  22. // 命令二
  23. var exportCmd = &cobra.Command{
  24. Use: "export",
  25. Short: "导出数据",
  26. Long: ``,
  27. Run: func(cmd *cobra.Command, args []string) {
  28. fmt.Println("export called")
  29. },
  30. }
  31. func Execute() {
  32. err := rootCmd.Execute()
  33. if err != nil {
  34. os.Exit(1)
  35. }
  36. }
  37. func init() {
  38. rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
  39. rootCmd.AddCommand(mockMsgCmd)
  40. rootCmd.AddCommand(exportCmd)
  41. exportCmd.Flags().StringP("out", "k", "./backup", "导出路径")
  42. }
  43. func main() {
  44. Execute()
  45. }

基本概念

Cobra由三部分组成:

  • 命令(Commands ):代表行为。命令是程序的中心点,程序的每个功能都应该可以通过命令进行交互,一个命令可以有任意个子命令。
  • 参数(Args):命令的参数
  • 标志(Flags):修饰命令。它修饰命令该如何完成。

官方推荐命令格式为:

  1. $ ./appName command args --Flag

如 hugo server —port=1313 :

  • appName: hugo
  • command: server
  • flag: port

命令行CLI工具(可选)

建议安装命令行工具 cobra-cli ,以方便快速创建cobra项目,增加command等。

  1. $ go install github.com/spf13/cobra-cli@latest

[

上一节

2. protoc自定义gin插件

](https://www.imooc.com/wiki/NewGo/seht2c1jBkIOnvHlJYrM.html)[

下一节

](https://www.imooc.com/wiki/NewGo/Ge3OTL6i7sVgDQCdhntz.html)