Go cobra 库学习
创始人
2024-03-19 08:56:28
0

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

 

相关内容

热门资讯

汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...