天天看點

cobra架構初探

cobra簡介

cobra是一個指令行程式庫,可以用來編寫指令行程式,非常簡單易用,類似于Go标準庫中的Flag包,不過它比Flag包強大很多。它提供了一個腳手架,可以生成基于cobra的應用程式架構。

cobra的github位址是https://github.com/spf13/cobra,可以看到很多知名的項目Kubernetes/Docker/Hugo/Etcd都在使用。

cobra的作者是spf13,它是Google工程師,也是Go項目團隊成員,它寫的很多項目都有過萬⭐️,非常受歡迎,例如hugo靜态部落格生成器。

cobra架構初探

cobra安裝

cobra安裝非常簡單,與我們安裝其他第三方庫是一樣的。執行下面的指令即可。

go get -u github.com/spf13/cobra/cobra
           

複制

然後檢查下是否安裝成功,執行下面的指令,輸出說明資訊說明已安裝成功。如果沒有正确輸出,檢查是否已将cobra加入到環境變量PATH中。

cobra -h
           

複制

cobra架構初探

cobra使用

初始化項目

我們通過寫一個demo項目學習cobra使用。在工作目錄下,建立一個cobraDemo檔案夾,然後執行go mod init cobraDemo操作。在目前的檔案夾下生成了mod檔案。

cobra架構初探

然後使用cobra提供的init指令初始化項目,會自動幫我們生成一些檔案,如下圖所示,自動生成了main.go檔案和cmd檔案夾, cmd檔案夾下有一個root.go檔案。

cobra init --pkg-name cobraDemo --author YongMing
           

複制

cobra架構初探

這裡簡單說下上述指令參數的含義,pkg-name用于指定工程指令,可以在目前目錄,也可以在相對目錄生成目錄名稱。author指定作者資訊,可以看到在生成的代碼檔案開頭攜帶了作者資訊。

cobra架構初探

編譯運作

在前面已建立了項目,現在進行編譯運作。在cobraDemo檔案下執行go build指令,在目前的檔案夾下生成了可執行檔案cobraDemo。

然後運作它./cobraDemo.

cobra架構初探

添加指令

下面為我們的cobraDemo添加一個test指令,操作如下,此時在cmd檔案夾下生成一個test.go檔案。

cobra add test
           

複制

cobra架構初探

重新編譯項目,運作cobraDemo,得到如下輸出。可以輸入指令多了一個test功能。

cobra架構初探

執行 ./cobraDemo test 會輸出test called.

指令結構

cobra結構由指令 (commands)、參數 (arguments)、标志 (flags)三部分組成.下面看它的代碼是怎麼組織的。

// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
 Use:   "cobraDemo",
 Short: "A brief description of your application",
 Long: `A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
 // Uncomment the following line if your bare application
 // has an action associated with it:
 // Run: func(cmd *cobra.Command, args []string) { },
}
           

複制

上面的程式片段來自cmd檔案夾下的root.go檔案。cobra中指令封裝成了一個cobra.Command結構。該結構主要包含執行的指令以及動作。指令對應到Command中的Use内容,執行的動作就是Command中的Run函數。

root.go是頂級指令對象,像./cobraDemo test指令,test是屬于cobraDemo下的子指令,形成了一個嵌套結構。對應到下面的代碼就是testCmd對象添加在rootCmd對象下,rootCmd.AddCommand(testCmd)。

var testCmd = &cobra.Command{
 Use:   "test",
 Short: "A brief description of your command",
 Long: `A longer description that spans multiple lines and likely contains examples
and usage of using your command. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
 Run: func(cmd *cobra.Command, args []string) {
  fmt.Println("test called")
 },
}

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

複制

指令參數

前面分析了cobra的指令結構,這裡在說下指令參數的使用。在test.go檔案init函數中添加下面的代碼

testCmd.Flags().StringP("author","a","YongMing","author info")
 testCmd.Flags().StringP("version","v","v0.0.1","version info")
           

複制

修改testCmd的Run方法為

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

  author,err:=cmd.Flags().GetString("author")
  if err!=nil{
   fmt.Println("get author info fail.")
  }
  fmt.Println("作者資訊: ",author)

  version,err:=cmd.Flags().GetString("version")
  if err!=nil{
   fmt.Println("get version info fail.")
  }
  fmt.Println("版本資訊: ",version)
 },
           

複制

重新編譯運作,這時可以看到輸出有作者和版本資訊

cobra架構初探

我們也可以通過參數Flags設定作者和版本資訊

cobra架構初探

總結

本文我們學習了cobra的基本使用以及代碼組織結構,這為我們學習其他項目能夠有所幫助,小編學習cobra原因是在看etcd源碼的時候,它裡面的etcdctl包基本都是用cobra包結合client包實作的,是以好奇cobra是個什麼東東,進行了初步學習。