简介

cobra是一个命令行程序库,可以用来编写命令行程序。同时,它也提供了一个脚手架,用于生成基于 cobra 的应用程序框架。非常多知名的开源项目使用了 cobra 库构建命令行,如Kubernetes、Hugo、etcd等等等等。本文介绍 cobra 库的基本使用和一些有趣的特性。

关于作者spf13,这里多说两句。spf13 开源不少项目,而且他的开源项目质量都比较高。相信使用过 vim 的都知道spf13-vim,号称 vim 终极配置。可以一键配置,对于我这样的懒人来说绝对是福音。他的viper是一个完整的配置解决方案。完美支持 JSON/TOML/YAML/HCL/envfile/Java properties 配置文件等格式,还有一些比较实用的特性,如配置热更新、多查找目录、配置保存等。还有非常火的静态网站生成器hugo也是他的作品。

快速使用

第三方库都需要先安装,后使用。下面命令安装了cobra生成器程序和 cobra 库:

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

如果出现了golang.org/x/text库找不到之类的错误,需要手动从 GitHub 上下载该库,再执行上面的安装命令。我以前写过一篇博客搭建 Go 开发环境提到了这个方法。

我们实现一个简单的命令行程序 git,当然这不是真的 git,只是模拟其命令行。最终还是通过os/exec库调用外部程序执行真实的 git 命令,返回结果。所以我们的系统上要安装 git,且 git 在可执行路径中。目前我们只添加一个子命令version。目录结构如下:

▾ get-started/▾ cmd/helper.goroot.goversion.gomain.go

root.go

package cmdimport ("errors""github.com/spf13/cobra"
)var rootCmd = &cobra.Command {Use: "git",Short: "Git is a distributed version control system.",Long: `Git is a free and open source distributed version control system
designed to handle everything from small to very large projects
with speed and efficiency.`,Run: func(cmd *cobra.Command, args []string) {Error(cmd, args, errors.New("unrecognized command"))},
}func Execute() {rootCmd.Execute()
}

version.go

package cmdimport ("fmt""os""github.com/spf13/cobra"
)var versionCmd = &cobra.Command {Use: "version",Short: "version subcommand show git version info.",Run: func(cmd *cobra.Command, args []string) {output, err := ExecuteCommand("git", "version", args...)if err != nil {Error(cmd, args, err)}fmt.Fprint(os.Stdout, output)},
}func init() {rootCmd.AddCommand(versionCmd)
}

main.go文件中只是调用命令入口:

package mainimport ("github.com/darjun/go-daily-lib/cobra/get-started/cmd"
)func main() {cmd.Execute()
}

为了编码方便,在helpers.go中封装了调用外部程序和错误处理函数:

package cmdimport ("fmt""os""os/exec""github.com/spf13/cobra"
)func ExecuteCommand(name string, subname string, args ...string) (string, error) {args = append([]string{subname}, args...)cmd := exec.Command(name, args...)bytes, err := cmd.CombinedOutput()return string(bytes), err
}func Error(cmd *cobra.Command, args []string, err error) {fmt.Fprintf(os.Stderr, "execute %s args:%v error:%v\n", cmd.Name(), args, err)os.Exit(1)
}

每个 cobra 程序都有一个根命令,可以给它添加任意多个子命令。我们在version.goinit函数中将子命令添加到根命令中。

编译程序。注意,不能直接go run main.go,这已经不是单文件程序了。如果强行要用,请使用go run .

$ go build -o main.exe

cobra 自动生成的帮助信息,very cool:

$ ./main.exe -h
Git is a free and open source distributed version control system
designed to handle everything from small to very large projects
with speed and efficiency.Usage:git [flags]git [command]Available Commands:help        Help about any commandversion     version subcommand show git version info.Flags:-h, --help   help for gitUse "git [command] --help" for more information about a command.

单个子命令的帮助信息:

$ ./main.exe version -h
version subcommand show git version info.Usage:git version [flags]Flags:-h, --help   help for version

调用子命令:

$ ./main.exe version
git version 2.19.1.windows.1

未识别的子命令:

$ ./main.exe clone
Error: unknown command "clone" for "git"
Run 'git --help' for usage.

编译时可以将main.exe改成git,用起来会更有感觉

Go 每日一库之 cobra相关推荐

  1. Go 每日一库之 viper

    简介 上一篇文章介绍 cobra 的时候提到了 viper,今天我们就来介绍一下这个库. viper 是一个配置解决方案,拥有丰富的特性: 支持 JSON/TOML/YAML/HCL/envfile/ ...

  2. Go 每日一库之 cli

    简介 cli是一个用于构建命令行程序的库.我们之前也介绍过一个用于构建命令行程序的库cobra.在功能上来说两者差不多,cobra的优势是提供了一个脚手架,方便开发.cli非常简洁,所有的初始化操作就 ...

  3. go get 失败 no go files in_Go 每日一库之 dig

    简介 今天我们来介绍 Go 语言的一个依赖注入(DI)库--dig.dig 是 uber 开源的库.Java 依赖注入的库有很多,相信即使不是做 Java 开发的童鞋也听过大名鼎鼎的 Spring.相 ...

  4. go float64 比较_Go 每日一库之 plot

    Go 每日一库之 plot 简介 本文介绍 Go 语言的一个非常强大.好用的绘图库--plot.plot内置了很多常用的组件,基本满足日常需求.同时,它也提供了定制化的接口,可以实现我们的个性化需求. ...

  5. go get 的不再src目录中_Go 每日一库之 sqlc:根据 sql 生成代码

    简介 在 Go 语言中编写数据库操作代码真的非常痛苦!database/sql标准库提供的都是比较底层的接口.我们需要编写大量重复的代码.大量的模板代码不仅写起来烦,而且还容易出错.有时候字段类型修改 ...

  6. go 默认http版本_【每日一库】超赞的 Go 语言 INI 文件操作

    点击上方蓝色"Go语言中文网"关注我们,领全套Go资料,每天学习 Go 语言 如果你使用 INI 作为系统的配置文件,那么一定会使用这个库吧.没错,它就是号称地表 最强大.最方便  ...

  7. go get如何删除_Go 每日一库之 xorm

    简介 Go 标准库提供的数据库接口database/sql比较底层,使用它来操作数据库非常繁琐,而且容易出错.因而社区开源了不少第三方库,如上一篇文章中的sqlc工具,还有各式各样的 ORM (Obj ...

  8. go 根据输入类型执行对应的方法_Go 每日一库之 sqlc

    简介 在 Go 语言中编写数据库操作代码真的非常痛苦!database/sql标准库提供的都是比较底层的接口.我们需要编写大量重复的代码.大量的模板代码不仅写起来烦,而且还容易出错.有时候字段类型修改 ...

  9. Go 每日一库之 zap

    转载地址:Go 每日一库之 zap - SegmentFault 思否 简介 在很早之前的文章中,我们介绍过 Go 标准日志库log和结构化的日志库logrus.在热点函数中记录日志对日志库的执行性能 ...

最新文章

  1. 正则匹配出字符串中两串固定字符区间的所有字符
  2. linux 产生0~1之间的随机数
  3. java基础判断题_java基础知识周测试题带答案
  4. WPF 实现验证码控件
  5. 第十届蓝桥杯 等差数列(Python)
  6. JS数据结构初识(一)-栈
  7. 应用系统迁移华为云评估
  8. windows10 1903中vmware无法运行解决方法和15.5安装
  9. Linux shell 查找操作
  10. 计算机电源管理设置,怎么修改电脑中设置的显卡电源管理模式
  11. linux python for循环语句,Python之for循环的使用
  12. 体系结构复习2——指令级并行(分支预測和VLIW)
  13. 彻底解决金山毒霸锁定chrome主页
  14. java满天星星闪烁_夜空当中满天的星星为什么会闪烁?
  15. unity通过浏览器打开网页
  16. HTTP 304: Not Modified
  17. 最全的软件测试面试题
  18. anemometer mysql 500_【Mysql】Anemometer-可视化慢sql查看
  19. mov,lea指令的区别
  20. 建立完善的员工晋升机制_员工晋升机制

热门文章

  1. 在PowerShell中查看环境变量Path
  2. html 垂直居中一般用什么意思,html – 什么使元素上的文本垂直居中?
  3. Python基础(06)——集合(set、frozenset)
  4. 上海市行政区划 (2023)
  5. numpy标准化数据的一个方法(belief[hallway ==1] *= 3)
  6. Nginx请求强制缓存设置
  7. 无人机光流定位系列——(二)实践
  8. 我个人的网站推广方法
  9. EventArgs 解释
  10. C#中sender与 eventargs的区别