Golang現代命令行應用框架Cobra

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.goinitConfig()方法裏我們能看到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框架,用於快速開發現代命令行應用。可以自動生成命令框架代碼,支持命令、子命令、標識以及配置文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章