Go cobra笔记
本文最后更新于:几秒前
Cobra 是一个 Golang 包,它提供了简单的接口来创建命令行程序。同时,Cobra 也是一个应用程序,用来生成应用框架,从而开发以 Cobra 为基础的应用
Cobra 介绍
- Cobra 是一个功能强大的现代化CLI应用程序库
- 有很多知名的Go项目使用Cobra进行构建,比如k8s,Docker,Hugo等
- 比默认的flag包强大很多
Cobra 概念
Cobra是由Commands,arguments,flags组成的 比如下面例子:
kubelet get pods -n kube-system
- app应用程序: kubelet
- command: get 表示具体的操作
- args: pods 表示参数
- flags: 是这些操作的修饰符 比如 -n
- args: kube-system
Cobra 安装和应用
获取第三方包的时候,通过代理,可以加速下载访问
export GOPROXY=https://goproxy.cn
cobra 安装
go mod init my-calc
go get -u github.com/spf13/cobra/cobra
cobra 初始化项目
(base) ➜ my-calc cobra init --pkg-name my-calc
Your Cobra application is ready at
/Users/budongshu/go/my-calc
cobra 执行流程
修改root.go代码
![image-20201214002630682](/Users/budongshu/Library/Application Support/typora-user-images/image-20201214002630682.png)
修改main.go 代码
下面可以看到输出流程
# go run main.go
I am init
I am main
I am initConfig
cobra 添加一个命令sum
sum子命令实现把后面的参数args 跟的int 数字进行 求和
//通过cobra 添加一个子命令 会生成sum.go 代码
# cobra add sum
// sum 1 2 3
# go run main.go sum 1 2 3
sum called
Sum of num: [1 2 3] is 6
上面生成的sum.go代码 我们通过修改sum.go来实现
func intSum(args []string) {
var sum int
for _,val := range args {
temp,err := strconv.Atoi(val)
if err != nil {
fmt.Printf("convert %s to int is error; %v\n",val,err)
continue
}
sum += temp
}
fmt.Printf("Sum of num: %s is %d\n",args,sum)
}
在sum.go 上面这里引用
在sum 基础上添加支持float 数据类型的 求和
//在sum.go 下面添加floatSum函数
func floatSum(args []string) {
var sum1 float64
for _,valf := range args{
tempf,errf := strconv.ParseFloat(valf,64)
if errf != nil {
fmt.Printf("convert %s to float is error %v\n",valf,errf)
continue
}
sum1 += tempf
}
fmt.Printf("sum float64 num: %s is %f\n",args,sum1)
}
//在 sum.go中 加入sum 命令本地使用的args 是一个布尔类型的判断
func init() {
rootCmd.AddCommand(sumCmd)
sumCmd.Flags().BoolP("float","f",false,"Sum float numbers") //新添加
//在sum.go 中
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("sum called")
//以下新添加代码,因为上面加一个布尔值,默认是false,可以用来使用,返回的布尔值进行判断
fStatus,_ := cmd.Flags().GetBool("float")
if fStatus { //如果是True 那就是float ,false 为int
floatSum(args)
} else {
intSum(args)
}
},
}
在sum基础上添加子命令
在sum基础上,加入一个子命令,进行求偶数和的功能
# cobra add even
package cmd
import (
"fmt"
"strconv"
"github.com/spf13/cobra"
)
// evenCmd represents the even command
var evenCmd = &cobra.Command{
Use: "even",
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("even called")
evenSum(args) //新加入代码
},
}
//下面为新加入函数
func init() {
//这里面要改成sumCmd 这样才可以做为sum的子命令
sumCmd.AddCommand(evenCmd)
}
func evenSum( args []string) {
var sum int
for _,val := range args {
temp,_ := strconv.Atoi(val)
if temp % 2 == 0 {
sum += temp
}
}
fmt.Printf("%s even %v\n",args,sum)
}
执行结果
(base) ➜ my-calc go run main.go sum even 1 2 3 6
even called
[1 2 3 6] even 8
最后看帮助信息
go run main.go -h
Usage:
my-calc [command]
Available Commands:
help Help about any command
sum A brief description of your command
Flags:
--config string config file (default is $HOME/.my-calc.yaml)
-h, --help help for my-calc
-t, --toggle Help message for toggle
Use "my-calc [command] --help" for more information about a command.
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!