cobra既是一个用于创建强大现代CLI应用程序的库,也是一个生成应用程序和命令文件的程序。cobra被用在很多go语言的项目中,比如 Kubernetes、Docker、Istio、ETCD、Hugo、Github CLI等等

其实简单的来说,cobra就是一个自定义命令工具,我们经常使用一些命令来构建项目,但是这些命令都是go自带的,你想写自己的命令就可以使用cobra库来试一试。

一,安装

$ go get -u github.com/spf13/cobra

二,简单的cobra项目

先构建一个简单的cobra命令,以此来熟悉cobra是怎么用的

创建一个cmd目录,在目录里创建一个myOrder.go,实际上这个名字可以随便命名,一般来说,你创建的啥命令就写啥名字,这不是为了好找么。

package cmdimport ("fmt""github.com/spf13/cobra"
)var rootCmd = cobra.Command{// 命令的名称Use: "myOrder",// 剪短介绍Short: "这是一个我的私有命令",// 详细介绍Long: "自定义私有命令,主要是想测试下这玩意能不能用",// 普通运行,如果需要返回error要使用RUNERun: func(cmd *cobra.Command, args []string) {fmt.Println("这是一条myOrder命令的反馈,反正啥也没处理")},
}func Execute() {if err := rootCmd.Execute(); err != nil {fmt.Println("这里有错误", err)}
}

然后在main.go 入口里运行Execute即可

main.go ↓

package mainimport "cobraTest/cmd"func main() {cmd.Execute()
}

cobraTest是这个项目的名字,cmd是刚才创建的那个包(目录)。

此时是不能直接像往常一样go run的,要先构建为可执行文件,在windows上就是exe

go build

go build之后会发现目录里多出了一个可执行文件,

这时候我们可以进行简单的测试

三,测试

执行可执行文件,并且带上我们刚才的那个命令

.\cobraTest.exe myOrder

这就是刚才写的那个RUN 里面的运行结果

四,增加flag参数

package cmdimport ("fmt""github.com/spf13/cobra"
)var rootCmd = cobra.Command{// 命令的名称Use: "myOrder",// 剪短介绍Short: "这是一个我的私有命令",// 详细介绍Long: "自定义私有命令,主要是想测试下这玩意能不能用",// 普通运行,如果需要返回error要使用RUNERun: func(cmd *cobra.Command, args []string) {fmt.Println("这是一条myOrder命令的反馈,反正啥也没处理")// 读取第一个flag 参数getString, _ := cmd.Flags().GetString("hahaha")fmt.Println(getString)// 读取第二个flag 参数getString, _ = cmd.Flags().GetString("heiheihei")fmt.Println(getString)},
}func Execute() {// 增加一个flag 参数// flag参数的名称,示例值,flag参数解释rootCmd.PersistentFlags().String("hahaha", "", "随便写点啥吧")// 再增加一个flag 参数rootCmd.Flags().String("heiheihei", "", "输入一些东西")if err := rootCmd.Execute(); err != nil {fmt.Println("这里有错误", err)}
}

在设定完rootCmd后,就可以直接给rootCmd结构体增加flag参数,并在run里面读取出来,修改代码后要重新go build,之后执行命令的时候,加上flag参数

.\cobraTest.exe myOrder --hahaha 哈哈哈 --heiheihei 嘿嘿嘿

五,额外命令

有的文章说这是子命令,其实是不恰当的,这是为了让一个工程可以有多条命令,而无需生成多个可执行文件。

构建两个命令,并在main.go里面写一个根命令

firstOrder.go ↓

package cmdimport ("fmt""github.com/spf13/cobra"
)// 大写可用于外部访问
var FirstCmd = cobra.Command{// 命令的名称Use: "firstOrder",// 剪短介绍Short: "1号命令",// 普通运行,如果需要返回error要使用RUNERun: func(cmd *cobra.Command, args []string) {fmt.Println("1号命令可以执行")},
}

secondOrder.go ↓

package cmdimport ("fmt""github.com/spf13/cobra"
)var SecondCmd = cobra.Command{// 命令的名称Use: "secondOrder",// 剪短介绍Short: "2号命令",// 普通运行,如果需要返回error要使用RUNERun: func(cmd *cobra.Command, args []string) {fmt.Println("2号命令可以执行")},
}

main.go ↓

package mainimport ("cobraTest/cmd""fmt""github.com/spf13/cobra"
)func main() {rootCmd := cobra.Command{Use:              "rootOrder",Short:            "根命令",TraverseChildren: true,}// 把这两条命令加入到根命令里面rootCmd.AddCommand(&cmd.FirstCmd)rootCmd.AddCommand(&cmd.SecondCmd)if err := rootCmd.Execute(); err != nil {fmt.Println("Could not run command")}
}

执行go build

Go cobra 库学习相关推荐

  1. 【libevent】libevent库学习总结(一)——基础

    libevent库学习总结(一)--基础 一.基础 1.1. 介绍 Libevent是一个用于开发可伸缩网络服务器的事件通知库.Libevent API提供了一种机制来执行回调函数,当某个特定事件发生 ...

  2. Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例

    2019独角兽企业重金招聘Python工程师标准>>> 原文地址:Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例 上一篇Guava库学习:学习 ...

  3. POCO C++库学习和分析

    POCO C++库学习和分析 -- 序 1. POCO库概述: POCO是一个C++的开源库集.同一般的C++库相比,POCO的特点是提供了整一个应用框架.如果要做C++程序应用框架的快速开发,我觉得 ...

  4. muduo网络库学习(八)事件驱动循环线程池EventLoopThreadPool

    muduo是支持多线程的网络库,在muduo网络库学习(七)用于创建服务器的类TcpServer中也提及了TcpServer中有一个事件驱动循环线程池,线程池中存在大量线程,每个线程运行一个Event ...

  5. muduo网络库学习(七)用于创建服务器的类TcpServer

    目前为止,涉及到的绝大多数操作都没有提及线程,EventLoop,Poller,Channel,Acceptor,TcpConnection,这些对象的执行都是在单独线程完成,并没有设计多线程的创建销 ...

  6. muduo网络库学习(四)事件驱动循环EventLoop

    muduo的设计采用高并发服务器框架中的one loop per thread模式,即一个线程一个事件循环. 这里的loop,其实就是muduo中的EventLoop,所以到目前为止,不管是Polle ...

  7. python xlwings 切片_Python xlwings库学习笔记(1)

    Python xlwings库学习笔记(1) Python是最近几年很火的编程语言,被办公自动化的宣传吸引入坑,办公自动化必然绕不开Excel的操作,能操作Excel的库有很多,例如: xlrd xl ...

  8. Golang实践录:命令行cobra库实例再三优化

    本文是上一文章<Golang实践录:命令行cobra库实例优化> 的优化,主要的子命令的业务实现的整理. 起因 上一版本实现的方式,还是有点不满意,格式也不对齐,重要的是,似乎不是正规的方 ...

  9. Golang实践录:命令行cobra库实例优化

    本文上一文章<Golang实践录:命令行cobra库实例> 的优化,主要的子命令的业务实现的整理. 起因 旧版本中,每个子命令的入口函数,均需一一判断传入参数,并调用对应的业务实现函数,编 ...

最新文章

  1. 长相酷似小强的小米「铁蛋」机器狗,售价 9999 元,打滚唱跳会空翻
  2. php中命名空间和use
  3. AppleScript 以管理员身份运行程序
  4. mysql savepoint 什么意思_关于MySQL中savepoint语句使用时所出现的错误
  5. cobertura覆盖率_Cobertura和Maven:集成和单元测试的代码覆盖率
  6. Web Hacking 101 中文版 十四、XML 外部实体注入(一)
  7. 无法装载这个对象_面试官:别的我不管,这个JVM虚拟机内存模型你必须知道
  8. DotNetNuke 中文乱码问题的解决
  9. 矩阵分析与应用 -- 线性方程组
  10. Matlab实现一元线性拟合
  11. windows安全事件ID编号解释大全
  12. VBA-循环语句之Do...Loop
  13. 系统分析师-资料总结-中
  14. SpringMVC多个拦截器流程简图
  15. SQL文件的导入与导出
  16. perl中bless的理解
  17. 【深度学习】3-从模型到学习的思路整理
  18. 解决 XXX cannot be resolved or is not a field 问题
  19. 潜龙号开启水下机器人_潜龙二号水下机器人:我的老家在沈阳
  20. python接单业余赚钱的门路_程序员业余时间怎么快速一年赚200万

热门文章

  1. in front of与in the front of
  2. s23赛季服务器维护到什么时候,王者荣耀s22赛季什么时候结束 s23赛季7号还是8号开始维护...
  3. nodejs+express+mysql 之 简单的在线HTML编辑器
  4. 组策略统一在桌面显示计算机图标
  5. mysql 预加载缓存_预加载与缓存
  6. 关于javax.servlet.*导包错误的解决方案
  7. 深度 | 驭势仿真实景建模技术,构筑无人驾驶的商业化世界
  8. 使用PyQt5写一个桌面程序
  9. 条形码类型介绍以及如何使用LEADTOOLS Barcodes
  10. Tableau最新版本之Tableau 2021.1