当前位置: 首页 > 工具软件 > mbank-cli > 使用案例 >

使用cobra创建cli命令行工具

田修为
2023-12-01

什么是cobra?

Cobra既是用于创建强大的现代CLI应用程序的库,也是用于生成应用程序和命令文件的程序。

  • Cobra是一个库,提供了一个简单的界面来创建类似于git&go工具的强大的现代CLI界面。

  • Cobra也是一个应用程序,它将生成您的应用程序支架,以快速开发基于Cobra的应用程序。

Cobra提供:

  • 简单易用的基于子-的CLI: ,app server,app fetch等。
  • 完全符合POSIX标准(包括短版和长版)
  • 嵌套的子命令
  • 全局,本地和级联标志
  • 易产生的应用程序和命令与cobra init appname&cobra add cmdname
  • 智能建议(app srver…你的意思是app server?)
  • 命令和标志的自动帮助生成
  • 自动帮助标志识别-h,–help等等。
  • 为您的应用程序自动生成bash自动完成
  • 为您的应用程序自动生成的手册页
  • 命令别名,以便您可以在不破坏它们的情况下进行更改
  • 定义您自己的帮助,用法等的灵活性。
  • 可选择与viper紧密集成,适用于12因素应用

Cobra建立在命令,参数和标志的结构上。

COMMAND代表动作,Args代表事物,Flags是这些动作的修饰符。

要遵循的模式是 APPNAME VERB NOUN --ADJECTIVE. 或 APPNAME COMMAND ARG --FLAG

如何使用cobra?

  1. 安装

    go get -u github.com/spf13/cobra/cobra
    
    or 在 github.com 目录下执行以下操作
    git clone https://github.com/spf13/cobra.git
    
  2. 初始化项目

    # 在gopath路径下的src目录下执行
    cobra init ‘项目名称(这里假设为test)’	
    
    
    # 该操作会在src目录下创建test目录
      ▾ test/
        ▾ cmd/
            root.go
          main.go
    
  3. 添加命令

    cobra add 命令(这里假设是version)
    # 这时cmd文件夹下会生成一个新的文件version.go,在这个文件中定义这个新的命令的动作。
    

    version.go内容如下:

    import (  
        "fmt"
     
        "github.com/spf13/cobra"
    )
     
    // versionCmd represents the version command
    var versionCmd = &cobra.Command{  
        Use:   "version",		## 命令名称
        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) {
            fmt.Println("version called")		## 这里表示执行test.exe version后执行的代码
        },
    }
     
    func init() {  
        rootCmd.AddCommand(versionCmd)		## 表示为root添加子命令version
     
        // Here you will define your flags and configuration settings.
     
        // Cobra supports Persistent Flags which will work for this command
        // and all subcommands, e.g.:
        // versionCmd.PersistentFlags().String("foo", "", "A help for foo")
     
        // Cobra supports local flags which will only run when this command
        // is called directly, e.g.:
        // versionCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
    }
    

    此时执行以下代码

    > go build -o test
     
    > test -h
     
    Usage:  
      test [command]
     
    Available Commands:  
      help        Help about any command
      version     A brief description of your command
     
    Flags:  
          --config string   config file (default is $HOME/.demo.yaml)
      -h, --help            help for demo
     
    执行新添加的命令
    >test version
    输出:version called
    
  4. 添加flag

    # 在version.go文件的init函数中添加局部flag
    func init() {  
        rootCmd.AddCommand(versionCmd)
        # 添加flag(bool类型)
        versionCmd.Flags().BoolP("isok", "p", false, "flag is ok?")
    }
    

    执行命令,则:

    >test version -h
     
    Usage:  
      test version [flags]
     
    Flags:  
      -h, --help   help for version
      -p, --isok   flag is ok?
     
    Global Flags:  
          --config string   config file (default is $HOME/.demo.yaml)
    
  5. flag赋值

    1. 使用全局flag
      让一个flag对所有命令生效,需要在root.go文件中创建一个变量存储flag值。

      # 1.在root.go 文件中添加一个变量name
      
      var name string
       
      # 2.在init函数中添加全局flag,将flag值存储到变量name中
       
      rootCmd.PersistentFlags().StringVar(&name, "name", "x", "set name")
       
       
      # 3.在子命令version的Run方法中输出name  
      Run: func(cmd *cobra.Command, args []string) {  
          fmt.Println("name is: ", name)
      }
       
       
      # 4.执行命令  
      test version --name wfl
      or
      test version -x wfl
      输出:
      name is:  wfl  
      
    2. 使用局部flag
      让一个flag对某个命令生效,需要在该命令文件中创建一个变量存储flag值。

      # 1.定义变量sunsine  
      var sunshine string
       
       
      # 2.在version.go的init函数中添加flag  
      versionCmd.Flags().StringVarP(&sunshine, "sunshine", "s", false, "you are my sunshine")
       
       
      # 3.在子命令version.go的Run方法中输出  
      Run: func(cmd *cobra.Command, args []string) {  
          fmt.Println("name is: ", name)
          fmt.Println("sunshine is: ", sunshine)
      }
       
       
      # 4.执行命令  
      test version --name wfl --sunshine wfl
      输出:
      name is:  wfl  
      sunshine is:  wfl  
      
    3. 必填flag
      默认情况下,flag是optional(选填),若flag为必填,则需要做如下设置
      如将version命令下的sunshine flag设置为必填

      # 1.init文件中增加flag定义  
      versionCmd.Flags().StringVarP(&sunshine, "sunshine", "s", "", "you are my sunshine")  
      versionCmd.MarkFlagRequired("sunshine")
      
 类似资料: