Cobra是一个用Go语言实现的命令行工具。并且现在正在被很多项目使用,例如:Kubernetes,、Hugo和Github CLI等。通过使用Cobra,不仅可以快速的创建命令行界面,也可以快速开发基于Cobra的应用程序。
在cobra的git地址上有详细的使用教程,本篇文章是学习总结。cobra的git地址为:https://github.com/spf13/cobra
Cobra由三部分组成:命令(Commands )、参数(Args)和标志(Flags)。
命令(Commands):代表行为。命令是程序的中心点,程序的每个功能都应该可以通过命令进行交互。一个命令可以有任意个子命令。
参数(Args):命令的参数
标志(Flags):修饰命令。它修饰命令该如何完成。
官方推荐命令格式为:
appName command args --Ffag
示例:
hugo server --port=1313
appName: hugo
command: server
flag: port
go get -u github.com/spf13/cobra
该命令执行完后,会在GOPATH\bin 目录下得到一个cobra应用程序,可以通过该应用程序快速的开发cobra项目。
通过cobra应用程序可以快速初始化一个cobra项目。其语法如下:
cobra init --pkg-name=appName
示例:
mkdir newApp && cd newAPP
go mod init newAPp
cobra init --pkg-name=newApp
初始化一个项目后,会在指定目录下生成主要的两个文件:
cmd/root.go和main.go。
package main
import "newApp/cmd"
func main() {
cmd.Execute()
}
main.go为程序的入口,主要作用是调用了newApp/cmd文件里的Execute()函数。
package cmd
var cfgFile string
// rootCmd表示在没有任何子命令的情况下调用的基本命令
var rootCmd = &cobra.Command{
Use: "newApp",
Short: "命令的简单描述, 当不指定这个命令时,显示这个描述。",
Long: `命令的详细描述, 当指定这个命令时,显示这个描述.
例如:newName -h`,
// 当调用就这个命令时,就会执行到这里。
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("newapp is called")
},
}
// 这个函数由main()调用。只需要在根cmd上发生一次。
// Execute() 也将所有子命令添加到根命令并适当的设置标志。
func Execute() {
cobra.CheckErr(rootCmd.Execute())
}
// init 函数,主要设置一些配置
func init() {
cobra.OnInitialize(initConfig)
// cobra支持全局的标志,在这里定义的标志全局可用。
// 这个标志下面会介绍到
//rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.new.yaml)")
// cobra也支持局部标志,在这里定义的只会在命令发送时调用。
// 下面也会介绍到
//rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
// 配置文件
func initConfig() {
...
...
}
cobra add commandName
示例:
cobra add serve
通过这条命令就可以为你的程序新增一条命令。重新编译后,运行一下程序就可以看到新增的命令。
而在cmd目录下可以看到增加了一个serve.go文件
var serveCmd = &cobra.Command{
Use: "serve",
Short: `短的描述, 短的描述在不指定使用这个命令时调用:
例如:newApp -h`,
Long: `长的描述`,
Run: func(cmd *cobra.Command, args []string) {
},
}
func init() {
// 把这个命令添加到rootCmd下面,就为rootCmd的子命令。
// 同样的道理,如果想为serve添加子命令。那么就add一个命令,
// 然后把新命令这里的代码改为:
// serveCmd.AddCommand(newCommandCmd)
rootCmd.AddCommand(serveCmd)
}
在上面main.go文件里有两处地方设置了标志。分别是:PersistentFlags和Flags
var rootCmd = &cobra.Command{
...
...
Run: func(cmd *cobra.Command, args []string) {
val, err := cmd.Flags().GetBool("toggle")
if err != nil{
fmt.Println("getBool err: ", err)
return
}
fmt.Println("toggle: ", val)
},
}
func init() {
cobra.OnInitialize(initConfig)
// toggele为flag的名称
// t为flag的简称
// false为默认值
// 最后一个参数为flagde 描述
rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
}
// 使用
> new.exe -t=true
toggle: true // 输出
var cfgFile string
var rootCmd = &cobra.Command{
...
...
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("cfgFile: ", cfgFile)
},
}
func init() {
cobra.OnInitialize(initConfig)
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.new.yaml)")
}
var rootCmd = &cobra.Command{
...
...
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
// 命令行的参数可以直接从args中获取。
fmt.Println("args: ", args)
},
}
在程序中,可以对参数输入进行控制。如Args:cobra.MininumNargs(1)。这个设置就是参数必须有大于等于一个。另外还有以下控制条件: