Golang现代命令行应用框架Cobra

本文介绍强大的命令行应用框架Cobra,让我们专注业务快速搭建强大的命令行应用。

1. 认识Cobra

Cobra是非常便利和流行的Golang包,用于开发强大命令行应用,包括命令、子命令、配置文件等。如果你了解docker的常用命令,你大概能理解Cobra的强大功能,docker就是使用Cobra作为其基础。

Cobra作为命令行应用框架,其强大功能还包括生成代码模板,让你只需关注业务实现。

1.1 安装Cobra

go get github.com/spf13/cobra/cobra
gopath/bincobra.exe
cobra init xapp --pkg-name xapp

上述命令即初始化项目xapp应用。其生成xapp目录并包括下列文件:

.
├── LICENSE
├── cmd
│   └── root.go
└── main.go
cobra init xapp --pkg-name xapp -l none

1.2 增加依赖管理

go mod init
go build

1.3 cobra命令

  • 增加命令

cobra add 命令名称 -p -l

增加命令, -p 指定父命令,不指定默认增加至根命令。-l 指定 license 字符串

作为约定命令名称一般使用动词。

2. 示例

我们先增加一个say 命令,可以实现问候功能。

cobra add say -l none

打开生成的文件say.go,我们看到默认命令实现:

	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("say called")
	},

在init函数中把该命令增加至rootCmd:

func init() {
	rootCmd.AddCommand(sayCmd)
}

下面我们实现其功能:

	Run: func(cmd *cobra.Command, args []string) {
		if len(args) < 1 {
			fmt.Println("Hello World!")
		}else {
			for _,item := range args{
				fmt.Println("Hello", item, "!")
			}
		}
	},
xapp sayxapp say tom

2.1 增加标识

rootCmd.AddCommand(sayCmd)
	rootCmd.AddCommand(sayCmd)
	sayCmd.Flags().StringP("name", "n", "", "Set your name")

上面设置了name标识,可以使用–name 或 -n 后面跟上参数,下面修改命令实现代码并解析name标识:

	Run: func(cmd *cobra.Command, args []string) {
		name, _:= cmd.Flags().GetString("name")
		if name == "" {
			name = "World"
		}
		fmt.Println("Hello " + name)
	},

编译测试:

xapp say hello -n jack

会输出“Hello jack”

2.2 使用环境变量作为缺省值

如果敏感数据不想显示在历史中,我们可以使用环境变量。这里使用Viper包,Cobra在生成的代码中已经依赖了Viper,Viper可以获取配置文件和环境的值。

下面代码使用环境变量作为缺省值,修改init函数代码:

func init() {
	rootCmd.AddCommand(sayCmd)
	sayCmd.Flags().StringP("name", "n", viper.GetString("ENVNAME"), "Set your name")
}

2.3 使用配置文件

.yaml
name: "Golang"
greeting: "Howdy"
root.goinitConfig()

真是好消息,我们不需要自己实现,仅需要在命令中处理配置文件相关参数值:

Run: func(cmd *cobra.Command, args []string) { greeting := "Hello" name, _ := cmd.Flags().GetString("name") if name == "" { name = "World" } if viper.GetString("name")!=""{ name = viper.GetString("name") } if viper.GetString("greeting")!=""{ greeting = viper.GetString("greeting") } fmt.Println(greeting + " " + name) },

编译并测试:

xapp say hello --config config.yml

输出结果: Howdy Golang

3. 总结

本文介绍了Cobra框架,用于快速开发现代命令行应用。可以自动生成命令框架代码,支持命令、子命令、标识以及配置文件。