go Cobra命令行工具入门教程
作者:Go和分布式IM 发布时间:2023-06-24 18:27:12
简介
Github:https://github.com/spf13/
cobraStar:26.5K
Cobra是一个用Go语言实现的命令行工具。并且现在正在被很多项目使用,例如:Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速的创建命令行工具,特别适合写测试脚本,各种服务的Admin CLI等。比如 Mattermost 项目,就写了很多 Admin CLI:
为什么需要cobra
我们看一个简单的demo使用前
package main
import (
"flag"
"fmt"
)
func main() {
flag.Parse()
args := flag.Args()
if len(args) <= 0 {
fmt.Println("Usage: admin-cli [command]")
return
}
switch args[0] {
case "help":
// ...
case "export":
//...
if len(args) == 3 { // 导出到文件
// todo
} else if len(args) == 2 { // 导出...
// todo
}
default:
//...
}
}
使用后
package main
import (
"fmt"
"github.com/spf13/cobra"
"os"
)
// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
Use: "api",
Short: "A brief description of your application",
Long: `A longer description `,
}
// 命令一
var mockMsgCmd = &cobra.Command{
Use: "mockMsg",
Short: "批量发送测试文本消息",
Long: ``,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("mockMsg called")
},
}
// 命令二
var exportCmd = &cobra.Command{
Use: "export",
Short: "导出数据",
Long: ``,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("export called")
},
}
func Execute() {
err := rootCmd.Execute()
if err != nil {
os.Exit(1)
}
}
func init() {
rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
rootCmd.AddCommand(mockMsgCmd)
rootCmd.AddCommand(exportCmd)
exportCmd.Flags().StringP("out", "k", "./backup", "导出路径")
}
func main() {
Execute()
}
运行:
$ go run main.go
A longer description
Usage:
api [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
export 导出数据
help Help about any command
mockMsg 批量发送测试文本消息
Flags:
-h, --help help for api
-t, --toggle Help message for toggle
Use "api [command] --help" for more information about a command.
发现了吗?你不用再处理各种参数组合了,从此释放了出来,只需要写自己的业务逻辑即可!
基本概念
Cobra由三部分组成:
命令(Commands ):代表行为。命令是程序的中心点,程序的每个功能都应该可以通过命令进行交互,一个命令可以有任意个子命令。
参数(Args):命令的参数
标志(Flags):修饰命令。它修饰命令该如何完成。
官方推荐命令格式为:
$ ./appName command args --Flag
如 hugo server --port=1313 :
appName: hugo
command: server
flag: port
安装
Go pkg
添加依赖
$ go get -u github.com/spf13/cobra@latest
导入即可:
import "github.com/spf13/cobra"
命令行工具
建议安装命令行工具 `cobra-cli` ,以方便快速创建cobra项目,增加command等。
# 命令行工具
$ go install github.com/spf13/cobra-cli@latest
安装完成之后,执行 `cobra-cli --help` (请确保GOBIN已配置),输出下列信息则代表成功:
$ cobra-cli --help
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.
Usage:
cobra-cli [command]
Available Commands:
add Add a command to a Cobra Application
completion Generate the autocompletion script for the specified shell
help Help about any command
init Initialize a Cobra Application
Flags:
-a, --author string author name for copyright attribution (default "YOUR NAME")
--config string config file (default is $HOME/.cobra.yaml)
-h, --help help for cobra-cli
-l, --license string name of license for the project
--viper use Viper for configuration
Use "cobra-cli [command] --help" for more information about a command.
入门实践
新建cobra命令行程序
安装了cobra-cli工具之后,执行 init 初始化创建项目:
$ cobra-cli init
此时,在当前目录自动生成如下文件:
├── LICENSE
├── cmd
│ └── root.go
└── main.go
main.go:
package main
import "tools/api/cmd"
func main() {
cmd.Execute()
}
root.go(有删减):
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
Use: "api",
Short: "A brief description of your application",
Long: `A longer description `,
//Run: func(cmd *cobra.Command, args []string) {
// fmt.Println("api called")
//},
}
// Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() {
err := rootCmd.Execute()
if err != nil {
os.Exit(1)
}
}
func init() {
// 全局flag
// rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.api.yaml)")
// local flag,暂不知道用处
rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
此时运行,不用指定参数,会执行rootCmd,打印使用说明:
$ go build
$ ./api
输出:
A longer description
Usage:
api [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
help Help about any command
Flags:
-h, --help help for api
-t, --toggle Help message for toggle
Use "api [command] --help" for more information about a command.
命令构成
分析上面的默认输出:
Available Commands:代表可以执行的命令。比如./api connect
Flags:是参数。比如./api connect --ip=127.0.0.1:6379,--ip就是flag,127.0.0.1:6379就是flag的值。
新增命令
我们来新增一个命令试试,这也是命令行程序的魅力,通过不同的参数执行不同的动作。
语法:
$ cobra-cli add [command]
比如:
$ cobra-cli add mock-msg
mockMsg created at /Users/xxx/repo/tools/api
此时,在cmd下会多一个文件(mock_msg.go),内容如下:
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
var mockMsgCmd = &cobra.Command{
Use: "mockMsg",
Short: "A brief description of your command",
Long: `mock msg command`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("mockMsg called")
},
}
func init() {
rootCmd.AddCommand(mockMsgCmd)
}
再执行rootCmd:
$ go build
$ ./api
会发现,多了一个命令:
// ...
Available Commands:
completion Generate the autocompletion script for the specified shell
help Help about any command
mockMsg A brief description of your command
// ...
执行mocMsg命令:
$ ./api mockMsg
mockMsg called
此时,就可以在生成的mock_msg.go:Run() 函数中,放你自己的业务逻辑代码了。
如何显示自己的命令用法
上面新增了一个命令mockMsg,通过 ./api help 打印了命令和help,但是 `Use` 里面指定的内容打印到哪里去了呢?这个时候,需要针对Command在指定help,此时就能打印这个命令的具体用法了。
./api mockMsg help
批量生产mq消息
Usage:
benchmark mockmsg [flags]
Flags:
-g, --goroutine int32 并发routine数量 (default 1)
-h, --help help for mockmsg
-p, --packet int32 每个routine一秒写入mq的数量 (default 20)
<br>-g和-p是新增的2个flag:
func init() {
mockmsgCmd.Flags().Int32P("goroutine", "g", 1, "并发routine数量")
mockmsgCmd.Flags().Int32P("packet", "p", 20, "每个routine一秒写入mq的数量")
rootCmd.AddCommand(mockmsgCmd)
}
获取这2个值:
// mockmsgCmd represents the mockmsg command
var mockmsgCmd = &cobra.Command{
Use: "mockmsg",
Short: "批量生产mq消息",
Run: func(cmd *cobra.Command, args []string) {
// 这里要写全名
g, _ := cmd.Flags().GetInt32("goroutine")
p, _ := cmd.Flags().GetInt32("packet")
fmt.Println("mockmsg called,flags:g=", g, ",p=", p, ",args:", args)
},
}
执行:
$ go run main.go mockmsg -p 322 -g 5 args1 args2
mockmsg called,flags:g= 5 ,p= 322 ,args: [args1 args2]
来源:https://www.cnblogs.com/wishFreedom/p/16407894.html
猜你喜欢
- PHP bin2hex() 函数实例把 "Hello World!" 转换为十六进制值:<?php $str =
- 全文索引在 MySQL 中是一个 FULLTEXT 类型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE
- 在Web上使用菜单可以极大地节约页面的空间,同时也比较的符合用户从Windows上继承下来的UI操作体验。在以往的Web页菜单设计中,我们普
- 先从String的扩展开始吧,后面有一部分的扩展要依赖这里扩展的方法。为了更加清晰和详细,我会一个方法一个方法地贴出来,你完全可以把所有的方
- 说实话,对于移除这个旧有功能对于我来说,我是欢心鼓舞的。因为我在开发和应用当中一向不用expression来处理,虽然它确实是非常方便,比如
- MySQL的ODBC接口实现是通过安装MyODBC驱动,这个驱动程序是跨平台的。如果在Linux等Unix体系操作系统下使用,需要先安装Io
- 这些列举的网站,站内还有大量的效果,希望大家多去找找,对于研究的朋友来说,更是很棒的源码参考。第5款的东东,很强很震撼...1、$fx()简
- MySQL目前不支持列的Default 为函数的形式,如达到你某列的默认值为当前更新日期与时间的功能,你可以使用TIMESTAMP列类型下面
- 内容摘要:浏览器不兼容这个难题,一直是网页设计师们头痛的事情。ie7.0的面世,尚且不论他是否较之ie6.0进步, ie7和ie6
- 许多人利用Session变量来开发ASP(Active Server Pages)。这些变量与任何编程语言中通用的变量非常相似,并且具有和通
- [sql] -- ===================【创建存储过程】===================== USE [Message
- 在学习与运用ASP中,response对象涉及到的方面也比较多,想全部都掌握也并非一两天的事,我也是最近才发现response对象中居然有这
- javascript中要判断一个变量是否为array通常是比较困难的,因为var a = [];alert(t
- 本文实例讲述了PHP开发实现微信退款功能。分享给大家供大家参考,具体如下:最近在调微信退款接口,发现有许多坑,更大家分享一下① 要是在测试的
- 当系统出现故障时,只要存在数据日志那么就可以利用它来恢复数据解决数据库故障。作为SQL Server数据库管理员,了解数据日志文件的作用,以
- 通配符:通配符描述示例%包含零个或更多字符的任意字符串。WHERE title LIKE '%computer%' 将查找处
- 当产品走到HTML Coding这块,多浏览器的测试是很重要,也很麻烦的一个环节。现在大家主要是保证IE6,7及Firefox的一致。bro
- 本文介绍了asp编程中使用数组的各种方法,并给出了详细的asp实例代码方便大家理解。asp中数组的定义Dim MyArray My
- JavaScript组件打包模式js组件通常带着css image ,但这样使用起来可能会有些小麻烦,为了让组件足够的solo,有了把css
- 解决MySQL中文乱码的问题看到从数据库中取出的数据全部是“?????”,太让人郁闷了。网上有很多方法来解决这个问