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框架,用於快速開發現代命令行應用。可以自動生成命令框架代碼,支持命令、子命令、標識以及配置文件。