使用Cobra开发自己的命令行工具
Cobra 项目地址:https://github.com/spf13/cobra
1 新建cobra项目
# 安装cobra-cli工具
go install github.com/spf13/cobra-cli@latest
# 新建项目目录
mkdir -p newApp
# 进入项目文件夹
cd myApp
# 初始化
go mod init && cobra-cli init
现在我们看到的目录结构应该是这样:
root.go
文件中有如下代码:
// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{Use: "newApp",Short: "A brief description of your application",Long: `A longer description that spans multiple lines and likely contains
examples and usage of using your application. 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.`,// Uncomment the following line if your bare application// has an action associated with it:// Run: func(cmd *cobra.Command, args []string) { },
}
解释一下上述代码中rootCmd
各个成员的含义:
Use: 命令的名称
Short: 对命令的简短描述
Long: 对命令的详细描述,输入[appName] -h的时候会显示出来
Run: 命令的具体逻辑,这就是我们要去实现的了
让我们直接运行一下这个程序,看看输出是怎样的。
# 编译
go build
# 执行
./newApp
可以看到,由于我们还没有实现Run
,所以只打印出了详细的描述信息。
2 添加COMMAND
cobra官方建议的指令格式是APPNAME COMMAND ARG --FLAG
,譬如git clone URL --bare
这样的。
# 添加新的COMMAND
cobra-cli add hello
现在cmd文件夹下应该多出了一个hello.go
文件,有如下代码:
// helloCmd represents the hello command
var helloCmd = &cobra.Command{Use: "hello",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("hello called")},
}
现在可以看到,helloCmd
有了一个默认的Run
成员,我们重新编译执行,输出如下:
输入./newApp hello
查看输出:
3 定制FLAG
如果我们想为hello定制flag,应该怎么做呢?
修改hello.go
中的init()
函数:
// 定义了两个全局变量
var Name *string
var Time *boolfunc init() {rootCmd.AddCommand(helloCmd)// 这样的flag无法通过if判断是否要输出// 且对于所有子命令都有效helloCmd.PersistentFlags().String("name", "", "Say hello to someone")// 这种flag就可以通过if来判断是否输出了,默认是false// 在调用command的时候加上 --time 或 -t 就可以变为true// 这样的flag仅对当前命令有效helloCmd.Flags().BoolP("time", "t", false, "Add time info to hello")
}
修改Run
函数的实现:
Run: func(cmd *cobra.Command, args []string) {str, _ := cmd.Flags().GetString("name")fmt.Printf("Hello, %s!\n", str)t, _ := cmd.Flags().GetBool("time")if t {fmt.Println("Time:", time.Now().Format("2006-01-02 15:04:05"))}
}
编译、查看输出:
cobra的flag默认情况下都是可选的,但如果我们想强制要求用户使用命令行工具的时候携带某些flag,也是可行的。我们可以在init()
函数中加入如下代码:
// 设置使用hello的时候后面必须加上nameerr := helloCmd.MarkPersistentFlagRequired("name")if err != nil {log.Fatal("Set flag required fail!")}
编译、运行:
可以看到,不带—-name
的命令自动报错了。
4 子命令
# 为hello命令添加子命令
cobra-cli add test -p helloCmd
这时候cmd文件夹下多了一个test.go
,我们去修改一下它的实现:
Run: func(cmd *cobra.Command, args []string) {str, _ := cmd.Flags().GetString("name")fmt.Printf("Test calling %s ...\n", str)t, _ := cmd.Flags().GetBool("time")if t {fmt.Println("Time:", time.Now().Format("2006-01-02 15:04:05"))}
}
编译、运行:
可以看到,test子命令对于—-name
是可以接收的,但是无法解析-t
,这是因为我们前面为helloCmd声明flag的方式不同(详见代码注释)。
5 ARG
如果想在命令中加入参数,应该怎么做呢?为了不那么混乱,我们新建一个args
命令:
cobra-cli add args
修改args.go文件中的代码:
// 设置最少需要一个参数Args: cobra.MinimumNArgs(1),Run: func(cmd *cobra.Command, args []string) {fmt.Println("args called, args: ", args)}
编译、运行:
以上就是cobra的简单使用。
参考文章
Go语言cobra库学习笔记–从入门到精通_random_w的博客-CSDN博客_cobra库
Go命令行库Cobra的使用_朱小厮的博客-CSDN博客_cobra 子命令
使用Cobra开发自己的命令行工具相关推荐
- 酷玩Go命令行工具—Cobra
不知大家有没有在使用Git命令.Linux的yum命令.Go命令.Maven命令的时候感觉到非常的酷,比如你刚刚拿到一个Go的开源项目,初始化时只需要输入go mod tidy进行对依赖的下载,或者是 ...
- 用PHP开发命令行工具
介绍 用过laravel开发过项目的都应该用过artisan,通过artisan我们可以在命令行中创建控制器类,Eloquent类等,今天我们将通过php来开发命令行工具 开发环境与工具 使用vagr ...
- 第三方模块——nodemon是一个命令行工具,用以辅助项目开发、nrm ( npm registry manager ):npm下载地址切换工具
什么是第三方模块 别人写好的.具有特定功能的.我们能直接使用的模块即第三方模块,由于第三方模块通常都是由多个文件组成并且被放置在一个文件夹中,所以又名包. 第三方模块 nodemon nodemon是 ...
- java venus_来认识一下venus-init——一个让你仅需一个命令开始Java开发的命令行工具...
前言 不知道你是否有过这样的经历.不管你是什么岗位,前端也好,后端也罢,想去了解一下Java开发到底是什么样的,它是不是真的跟传说中的一样. 于是你拿起键盘,用触控板 ? '' : 抄起鼠标',开始了 ...
- 命令行工具开发:如何快速实现命令行提示?
简介:对于稍微复杂一些的命令行工具,命令行的提示功能必不可少.那么对于不同语言的开发者,有没有一种简单快捷的实现方式呢?本文分享一种快速实现的方法,使用YAML文件定义命令行工具的使用规范,再通过工具 ...
- 使用 Apache Commons CLI 开发命令行工具
http://www.ibm.com/developerworks/cn/java/j-lo-commonscli/index.html 使用 Apache Commons CLI 开发命令行工具 杨 ...
- Node交互式命令行工具开发——自动化文档工具
转载自:小磊 https://segmentfault.com/a/1190000039749423 nodejs开发命令行工具,流程相对简单,但一套完整的命令行程序开发流程下来,还是需要下点功夫,网 ...
- 开发一个从磁力链取得影片截图的命令行工具
开发了一个不需要下载磁力链里的整个影片,可以对磁力链(或种子)里面的影片进行截图的Node命令行工具.我们来聊聊相关的技术点吧. 日常,一个经常性遇到的问题就是:有个种子(或磁力链)摆在你面前,要先下 ...
- go Cobra命令行工具入门
简介 Github:https://github.com/spf13/cobra Star:26.5K Cobra是一个用Go语言实现的命令行工具.并且现在正在被很多项目使用,例如:Kubernete ...
最新文章
- windows使用.NET CORE下创建MVC,发布到linux运行
- Flash 组件应用与开发
- pandas中inplace_pandas回顾小结(二)
- html5教学文档笔记,4.HTML 教程- (HTML5 基础)
- 星益云聚合收银台v1.45开源完整版【最终版本】
- 微信处罚腾讯判定其滥用原创:不要惹我 我狠起来能铁锅炖自己!
- Halcon 学习总结——仿射变换
- 基于LSTM的多变量多步序列预测模型实战「超详细实现说明讲解」
- 科来网络分析系统11.1(技术交流免费版)
- 不精确微分/不完整微分(Inexact differential/Imperfect differential)
- 安卓手机获取root权限
- python idle解释器的命令提示符是_Python IDLE使用
- 修改form表单action路径
- php电商开源框架,Sylius 开源PHP电商解决方案
- 【GNSS高精度定位应用】
- CodeForce#1625B Elementary Particles解题笔记
- iOS摸鱼周报 第二期
- E1、CE1、T1、PRI、BRI知识介绍和配置
- 引用wps进行word转pdf操作
- 循环卷积和线性卷积以及快速卷积计算