目錄
用法" >用法
使用 cobra 自带的 cli 工具 生成项目" >使用 cobra 自带的 cli 工具 生成项目
安装 cli 工具" >安装 cli 工具
初始化 Cobra CLI 应用程序" >初始化 Cobra CLI 应用程序
将命令添加到项目" >将命令添加到项目
采用手动进行项目开发" >采用手动进行项目开发
首頁 後端開發 Golang Cobra 命令列開發

Cobra 命令列開發

Aug 04, 2023 pm 05:59 PM
cobra庫

問題

#在網路上找過很多關於cobra 的開發資料,大多數都是複製官網的教程,極度缺乏參考價值;所以在開發完專案之後,準備自己來寫一篇cobra 的開發教程。

Cobra 概述

#Cobra 是一個函式庫,它提供了一個簡單的介面來建立強大的現代CLI介面,類似於git 和go 工具。

眼鏡蛇提供:

  • 簡單的基於子指令的 CLI:app serverapp fetch等。
  • 完全符合POSIX 的標誌(包括短版和長版)
  • 巢狀子指令
  • 全域、本地和級聯標誌
  • 明智的建議(app srver......你的意思是app server?)
  • 指令和標誌的自動幫助產生
  • -h,--help 等的自動說明標誌識別
  • 為您的應用程式自動產生shell 自動完成功能(bash、zsh、fish、powershell)
  • 為您的應用程式自動產生的手冊頁
  • 命令別名,這樣您就可以在不破壞它們的情況下進行更改
  • #定義您自己的幫助、使用等的靈活性。
  • 可選與viper[1]無縫集成,用於 12-factor 應用程式。

安裝

#使用 Cobra 很容易。首先,用於go get安裝最新版本的函式庫。

go get -u github.com/spf13/cobra@latest
登入後複製

接下來,在您的應用程式中包含 Cobra:

import "github.com/spf13/cobra"
登入後複製

用法

使用 cobra 自带的 cli 工具 生成项目

安装 cli 工具

go install github.com/spf13/cobra-cli@latest
登入後複製

使用方式

  1. 创建一个新的文件夹
  2. cd 到这个文件夹里面去
  3. 运行 go mod init <MODNAME> 来创建一个go mod 项目

例如:

cd $HOME/code 
mkdir myapp
cd myapp
go mod init github.com/spf13/myapp
登入後複製

初始化 Cobra CLI 应用程序

从 Go 模块中运行 cobra-cli init。这将创建一个新的基本项目让您修改。

您将需要打开并编辑 cmd/root.go 并提供您自己的描述和逻辑。

例如:

cd $HOME/code/myapp
cobra-cli init
go run main.go
登入後複製

将命令添加到项目

初始化 cobra 应用程序后,您可以继续使用 Cobra 生成器向您的应用程序添加其他命令。执行此操作的命令是cobra-cli add.

在您的项目目录(您的 main.go 文件所在的位置)中,您将运行以下命令:

cobra-cli add serve
cobra-cli add config
cobra-cli add create -p &#39;configCmd&#39;
登入後複製

其中还有很多标志我这里就不在细说了,需要了解的可以访问 cobra-cli[2] 自行查看。

采用手动进行项目开发

我们先来看一下 cobra 推荐的项目目录结构

▾ appName/
    ▾ cmd/
        add.go
        your.go
        commands.go
        here.go
    main.go
登入後複製

并且在main.go 中应该非常的简单:

package main

import (
  "{pathToYourApp}/cmd"
)

func main() {
  cmd.Execute()
}
登入後複製

然后需要创建一个 rootCmd 来当做 命令的入口 (在 cmd/root.go 中)

var rootCmd = &cobra.Command{
  Use:   "hugo",
  Short: "Hugo is a very fast static site generator",
  Long: `A Fast and Flexible Static Site Generator built with
                love by spf13 and friends in Go.
                Complete documentation is available at http://hugo.spf13.com`,
  Run: func(cmd *cobra.Command, args []string) {
    // Do Stuff Here
  },
}

func Execute() {
  if err := rootCmd.Execute(); err != nil {
    fmt.Fprintln(os.Stderr, err)
    os.Exit(1)
  }
}
登入後複製

您将在 init() 函数中另外定义标志和句柄配置。

package cmd

import (
 "fmt"
 "os"

 "github.com/spf13/cobra"
 "github.com/spf13/viper"
)

var (
 // Used for flags.
 cfgFile     string
 userLicense string

 rootCmd = &cobra.Command{}
)

// Execute executes the root command.
func Execute() error {
 return rootCmd.Execute()
}

func init() {
 cobra.OnInitialize(initConfig)

 rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra.yaml)")
 rootCmd.PersistentFlags().StringP("author", "a", "YOUR NAME", "author name for copyright attribution")
 rootCmd.PersistentFlags().StringVarP(&userLicense, "license", "l", "", "name of license for the project")
 rootCmd.PersistentFlags().Bool("viper", true, "use Viper for configuration")
 viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))
 viper.BindPFlag("useViper", rootCmd.PersistentFlags().Lookup("viper"))
 viper.SetDefault("author", "NAME HERE <EMAIL ADDRESS>")
 viper.SetDefault("license", "apache")

 rootCmd.AddCommand(addCmd)
 rootCmd.AddCommand(initCmd)
}

func initConfig() {
 if cfgFile != "" {
  // Use config file from the flag.
  viper.SetConfigFile(cfgFile)
 } else {
  // Find home directory.
  home, err := os.UserHomeDir()
  cobra.CheckErr(err)

  // Search config in home directory with name ".cobra" (without extension).
  viper.AddConfigPath(home)
  viper.SetConfigType("yaml")
  viper.SetConfigName(".cobra")
 }

 viper.AutomaticEnv()

 if err := viper.ReadInConfig(); err == nil {
  fmt.Println("Using config file:", viper.ConfigFileUsed())
 }
}
登入後複製

接下来就是开发 配置各种 cobra cmd 的参数,在配置之前,我们先来熟悉一下 cmd 的内容。

type Command struct {
 // 使用是单行使用消息。
    // 推荐的语法如下: 
    //    [ ] 标识一个可选参数。未括在括号中的参数是必需的。 
    //    ... 表示您可以为前一个参数指定多个值。 
    //    |表示互斥信息。您可以使用分隔符左侧的参数或分隔符右侧的参数。您不能在一次使用该命令时同时使用这两个参数。
    //    { } 分隔一组互斥参数,当需要其中一个参数时。如果参数是可选的,则将它们括在方括号 ([ ]) 中。
    // 示例:add [-F file | -D dir]... [-f format] profile
 Use string

 // Aliases 是一个别名数组,可以用来代替 Use 中的第一个单词。
 Aliases []string

 // SuggestFor 是一个命令名称数组,将为其建议该命令 - 类似于别名,但只是建议。
 SuggestFor []string

 // Short 是“帮助”输出中显示的简短描述。
 Short string

 // Long 是“help <this-command>”输出中显示的长消息。
 Long string

 // Example is examples of how to use the command.
 Example string

 // ValidArgs 是 shell 完成中接受的所有有效非标志参数的列表,(提供的自动补全的参数)
 ValidArgs []string
 // ValidArgsFunction 是一个可选函数,它为 shell 完成提供有效的非标志参数。
    // 它是使用 ValidArgs 的动态版本。只有 ValidArgs 和 ValidArgsFunction 之一可用于命令。
 ValidArgsFunction func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective)

 // 判断参数的格式,内置多种验证格式。
 Args PositionalArgs

 // ArgAliases 是 ValidArgs 的别名列表。这些不是在 shell 完成中向用户建议的,但如果手动输入则接受。
 ArgAliases []string

 // BashCompletionFunction 是传统 bash 自动完成生成器使用的自定义 bash 函数。
    // 为了与其他 shell 的可移植性,建议改用 ValidArgsFunction
 BashCompletionFunction string

 // Deprecated defines, if this command is deprecated and should print this string when used.
 Deprecated string

 // Annotations are key/value pairs that can be used by applications to identify or
 // group commands.
 Annotations map[string]string

 // Version defines the version for this command. If this value is non-empty and the command does not
 // define a "version" flag, a "version" boolean flag will be added to the command and, if specified,
 // will print content of the "Version" variable. A shorthand "v" flag will also be added if the
 // command does not define one.
 Version string

 // Run 函数按以下顺序执行:
 //   * PersistentPreRun()
 //   * PreRun()
 //   * Run()
 //   * PostRun()
 //   * PersistentPostRun()
 // 所有函数都获得相同的参数,即命令名称后面的参数。
 //
 // PersistentPreRun: 该命令的子级将继承并执行。
 PersistentPreRun func(cmd *Command, args []string)
 // PersistentPreRunE: 上面的返回错误形式
 PersistentPreRunE func(cmd *Command, args []string) error
 // PreRun: 此命令的子级不会继承。
 PreRun func(cmd *Command, args []string)
 // PreRunE: 上面的返回错误形式
 PreRunE func(cmd *Command, args []string) error
 // Run: 通常是实际的功函数。大多数命令只会实现这一点。
 Run func(cmd *Command, args []string)
 // RunE: 上面返回错误的形式
 RunE func(cmd *Command, args []string) error
 // PostRun: 在 run 命令之后运行。
 PostRun func(cmd *Command, args []string)
 // PostRunE: 上面返回错误的形式。
 PostRunE func(cmd *Command, args []string) error
 // PersistentPostRun: 该命令的子命令将在 PostRun 之后继承并执行。
 PersistentPostRun func(cmd *Command, args []string)
 // PersistentPostRunE: 上面返回错误的形式。
 PersistentPostRunE func(cmd *Command, args []string) error

    ...

 //FParseErrWhitelist flag parse errors to be ignored
 FParseErrWhitelist FParseErrWhitelist

 // CompletionOptions 是一组用于控制 shell 完成处理的选项 (下面给出了对应的结构体)
 CompletionOptions CompletionOptions

 ...
    
 // TraverseChildren 在执行子命令之前解析所有父项的标志。
 TraverseChildren bool

 // Hidden defines, 如果此命令被隐藏并且不应该出现在可用命令列表中。
 Hidden bool

 ...
}
登入後複製
// CompletionOptions are the options to control shell completion
type CompletionOptions struct {
    // DisableDefaultCmd 防止 Cobra 创建默认的“完成”命令 (禁用这么默认的 cmd 命令)
 DisableDefaultCmd bool
 // 防止 Cobra 为支持完成描述的 shell 创建“--no-descriptions”标志
 DisableNoDescFlag bool
 // DisableDescriptions 关闭支持它们的 shell 的所有完成描述
 DisableDescriptions bool
    // HiddenDefaultCmd 隐藏默认的“完成”命令 (一般情况下,采用隐藏这个 cmd )
 HiddenDefaultCmd bool
}
登入後複製

这里大概就看了 Cmd  的大概使用的结构体和字段,在开发的时候对应需要的东西,直接设置对应的值即可。

Short 的描述使用 shell 自动完成提示信息使用。

Long 的描述用于 -h help  打印使用。

生成自动提示命令的功能

具体的操作步骤可以看 生成外壳完成[3]

在这里需要说一句的是:使用命令生成的时候默认是打印在 控制台,需要自己重定义在指定的目录文件中去。

在根据不同的平台终端,配置好这个文件,然后就可以使用 自动提示完成的 功能了。

以上是Cobra 命令列開發的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Debian OpenSSL有哪些漏洞 Debian OpenSSL有哪些漏洞 Apr 02, 2025 am 07:30 AM

OpenSSL,作為廣泛應用於安全通信的開源庫,提供了加密算法、密鑰和證書管理等功能。然而,其歷史版本中存在一些已知安全漏洞,其中一些危害極大。本文將重點介紹Debian系統中OpenSSL的常見漏洞及應對措施。 DebianOpenSSL已知漏洞:OpenSSL曾出現過多個嚴重漏洞,例如:心臟出血漏洞(CVE-2014-0160):該漏洞影響OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻擊者可利用此漏洞未經授權讀取服務器上的敏感信息,包括加密密鑰等。

您如何使用PPROF工具分析GO性能? 您如何使用PPROF工具分析GO性能? Mar 21, 2025 pm 06:37 PM

本文解釋瞭如何使用PPROF工具來分析GO性能,包括啟用分析,收集數據並識別CPU和內存問題等常見的瓶頸。

Go的爬蟲Colly中Queue線程的問題是什麼? Go的爬蟲Colly中Queue線程的問題是什麼? Apr 02, 2025 pm 02:09 PM

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

Go語言中用於浮點數運算的庫有哪些? Go語言中用於浮點數運算的庫有哪些? Apr 02, 2025 pm 02:06 PM

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

您如何在GO中編寫單元測試? 您如何在GO中編寫單元測試? Mar 21, 2025 pm 06:34 PM

本文討論了GO中的編寫單元測試,涵蓋了最佳實踐,模擬技術和有效測試管理的工具。

從前端轉型後端開發,學習Java還是Golang更有前景? 從前端轉型後端開發,學習Java還是Golang更有前景? Apr 02, 2025 am 09:12 AM

後端學習路徑:從前端轉型到後端的探索之旅作為一名從前端開發轉型的後端初學者,你已經有了nodejs的基礎,...

您如何在go.mod文件中指定依賴項? 您如何在go.mod文件中指定依賴項? Mar 27, 2025 pm 07:14 PM

本文討論了通過go.mod,涵蓋規範,更新和衝突解決方案管理GO模塊依賴關係。它強調了最佳實踐,例如語義版本控制和定期更新。

Debian下PostgreSQL監控方法 Debian下PostgreSQL監控方法 Apr 02, 2025 am 07:27 AM

本文介紹在Debian系統下監控PostgreSQL數據庫的多種方法和工具,助您全面掌握數據庫性能監控。一、利用PostgreSQL內置監控視圖PostgreSQL自身提供多個視圖用於監控數據庫活動:pg_stat_activity:實時展現數據庫活動,包括連接、查詢和事務等信息。 pg_stat_replication:監控複製狀態,尤其適用於流複製集群。 pg_stat_database:提供數據庫統計信息,例如數據庫大小、事務提交/回滾次數等關鍵指標。二、借助日誌分析工具pgBadg

See all articles