使用cobra创建cli命令行工具

2023-11-02

什么是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")
      
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用cobra创建cli命令行工具 的相关文章

随机推荐

  • 组态王和plc之间如何建立通讯?

    这两者之间可以有很多种通讯方式 比如 PROFIBUS MPI 以太网 DDE OPC MODBUS 自由口等 主要还是要看你的PLC选型 以及组网方式 现在最常见 也最常用的大概要数RS485 MODBUS协议下的无线通讯方式了 我们假定
  • 中国十大最狠的流氓网站曝光!

    动了流氓软件的发展 谁又从流氓软件中获利 揭开流氓软件背后的始佣者 网易科技独家选出中国十大流氓网站 以下是网易科技评选的十大流氓网站 1 3721 com 中文实名 这个是流氓软件的开山鼻祖 就是因它将中国互联网带入到一个流氓时代 这里就
  • 今日头条2018年校招视频面试过程 一面(编程题两道)

    首先面试官让自我介绍一下 然后问你做过的项目问你擅长的语言 你与其他同学相比的优点 等等 有两道笔试题 1 0 9a z表示36进制 写一个方法计算36进制的和 2 单链表进行反转 附上我写的代码 仅供参考 java代码实现 1 36进制求
  • elementUI 框架组件

    文章目录 elementUI 框架学习笔记 1 创建一个vue cli脚手架 2 Container 布局容器 3 Layout 布局 4 按钮 button 5 链接 6 表单系列 6 1 input 输入框 6 1 1 基础用法 6 1
  • vue 项目中使用 Loading 组件

    当在vue项目中请求后台接口时 常常会使用 loding 过渡数据的加载时间 如果 loading 作为一个全局的加载状态 应该写在项目中的App vue中
  • 大数据项目实战——基于某招聘网站进行数据采集及数据分析(五)

    大数据项目实战 第五章 数据分析 文章目录 大数据项目实战 学习目标 一 设计 Hive 数据仓库 1 事实表 ods jobdata origin 2 维度表 t salary detail 3 维度表 t company detail
  • 15 jQuery Plugins For A Better Photo Gallery And Slideshow

    Photo Gallery picture gallery or slideshow are the best way to showcase your images photos to your readers There are a l
  • 设计原则之组合复用原则的概念及实例代码操作

    场景 例题 教育局的学校管理中包括小学 初中和高中等三个级别老师与学生 不使用组合复用原则的解法 代码实现 采用继承实现 class Person class Teachers extends Person class Students e
  • 基于stm32f1的lora开发基础通信实验

    一 实验条件 环境 win10专业版 keil uv5 串口调试助手 stm32f1系列单片机 as32lora模块 这里是泽耀科技的as32 ttl 100 二 实现功能 1 使用定时器将底层数据通过as32每隔1秒向上层串口发送一段数据
  • 二、RabbitMQ在某商城项目中的使用案例

    一 在对商品增删改查的时候发送消息 在item service中引入amqp依赖
  • 七牛云完整详细配置(从零到一)

    创建存储空间 自定义域名 配置域名的 CNAME 1 复制刚刚新建的域名的CNAME 2 登录域名服务商 这里以阿里云为例 的控制台 添加域名解析 保存后回到七牛存储空间的控制台 可以看到加速域名绑定状态为处理中 最久应该是10分钟 使用七
  • 【Ubuntu】systemd 及其工具

    什么是 systemd systemd 是一个用于管理 Linux 系统启动过程和系统服务的初始化系统 它是现代 Linux 发行版中广泛采用的初始化系统 负责启动和管理操作系统的各个组件 systemd 的设计目标是提高系统启动速度 优化
  • 内网穿透-frp

    frp的作用 1 利用处于内网或防火墙后的机器 对外网环境提供 http 或 https 服务 2 对于 http https 服务支持基于域名的虚拟主机 支持自定义域名绑定 使多个域名可以共用一个80端口 3 利用处于内网或防火墙后的机器
  • Myeclipse10下载,安装,破解,插件,优化介绍(CSDN首发)

    一 Myeclipse10下载与破解 Genuitec公司发布了MyEclipse 10 一款Genuitec旗下的商业化Eclipse集成开发工具的升级版本 MyEclipse 10基于Eclipse Indigo构建 为Java和Jav
  • TOMCAT的SERVER.XML的详细说明

    Example Server Configuration File gt
  • 如何让div靠右_div向右偏移设置 css让div靠右移一定距离

    转自 https www thinkcss com shili 1372 shtml div对象盒子向右偏移设置 使用css让div靠右一定距离 div向右移教程实例篇 div向右偏移一定距离 可采用margin外边距实现 也可以使用pad
  • 史上最全的自动驾驶研究报告(上)

    https www jianshu com p b85a982ad4c8 自动驾驶是百年汽车工业史上又一次伟大的范式转移 将重新定义汽车产业规则 汽车的产品定义将不再是 行走的精密仪器 也不只是一台 行走的计算机 而是 行走的第三空间 车厂
  • RAM明明断电会丢失数据,为什么初始化的全局变量存储在RAM?详细分析程序的存储

    前言 1 之前因为一个字符指针和字符数组指针引发的bug 折磨了我一个下午才发现问题 之后我就打算研究一下系统是如何发现野指针乱访问问题 后面就一直深入到微机系统中的内存管理了 2 这些其实都是基础知识 只不过我一直不太明白 所以在此记录一
  • Flink架构

    1 Flink 任务提交流程 TaskManager是一个独立的jvm进程 每个task slot表示TaskManager拥有资源的一个固定大小的子集 假如一个TaskManager有三个slot 那么它会将其管理的内存分成三份给各个sl
  • 使用cobra创建cli命令行工具

    什么是cobra Cobra既是用于创建强大的现代CLI应用程序的库 也是用于生成应用程序和命令文件的程序 Cobra是一个库 提供了一个简单的界面来创建类似于git go工具的强大的现代CLI界面 Cobra也是一个应用程序 它将生成您的