Golang现代命令行应用框架Cobra

  • Post author:
  • Post category:golang




Golang现代命令行应用框架Cobra

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



1. 认识Cobra

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

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



1.1 安装Cobra

go get github.com/spf13/cobra/cobra

上面命令即在

gopath/bin

目录下下载

cobra.exe

文件。这时可以使用cobra名称初始化项目,然后创建命令或子命令,最后你对生成的命令模板文件进行修改加入必要的业务逻辑。

cobra init xapp --pkg-name xapp

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

.
├── LICENSE
├── cmd
│   └── root.go
└── main.go

如果不需要licence,可以在上面命令后面加上标记

cobra init xapp --pkg-name xapp -l none

.



1.2 增加依赖管理

打开上面生成的项目,默认需要一些依赖,这里使用mod作为依赖管理工具。在xapp目录下执行命令:

go mod init

,执行后在当前目录下生成go.mod文件。

下面进行

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 say

,带上参数

xapp say tom

, 分别输出Hello World! 和 Hello tom!



2.1 增加标识

假设我们要给say命令增加标识 -n 标识问候人名称。

修改init函数,在原

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"

我们前面的命令是通过cobra生成,其已经包括配置文件选项。在

root.go



initConfig()

方法里我们能看到Viper负责实现该功能。

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


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框架,用于快速开发现代命令行应用。可以自动生成命令框架代码,支持命令、子命令、标识以及配置文件。



版权声明:本文为neweastsun原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。