## 底層庫的選擇
Go 的命令行底層庫有兩個非常知名的選項:
* [github.com/urfave/cli](https://github.com/urfave/cli)一萬多 star
* [github.com/spf13/cobra](https://github.com/spf13/cobra)兩萬多 star
Gohub 項目里,我們將選擇 star 數更高的 cobra 項目。cobra 功能比較強大,設計優良,最重要的**它支持全局選項**。
cli 庫做不到`--env`參數后加子命令,例如說:
~~~php
# 指定加載 .env.testing 設定的環境變量來運行 migrate 子命令
$ gohub --env=testing migrate
~~~
主要還是跟其實現方式有關,cli 依賴于官方的 flag 包。而 flag 包的邏輯是會把`--env`參數后面的所有內容都當做選項的值,詳細的討論請見[github.com/urfave/cli/issues/427](https://github.com/urfave/cli/issues/427)。
Cobra 使用的是自己實現的選項解析器 ——[github.com/spf13/pflag](https://github.com/spf13/pflag),故不存在此問題。
另外一個 cli 的不足之處是不支持全局選項,無法滿足我們全局選項`--env`的需求。
## cobra.Command struct
在 Cobra 里,所有命令都是一個 cobra.Command 的實現。一個簡單示例:
~~~php
var CmdMakeSeeder = &cobra.Command{
Use: "seeder",
Short: "Create seeder file, example: make seeder user",
Run: runMakeSeeder,
Args: cobra.ExactArgs(1), // 只允許且必須傳 1 個參數
}
~~~
下面是一個 cobra.Command 的注釋,基本上涵蓋 Cobra 的大部分功能點:
~~~php
// Command代表執行命令的結構
type Command struct {
// 代表當前命令的,如何執行,root 最好和生成的命令工具名稱一致
Use string
// 代表這個工具的別名,在 subCommand 中有用,比如 root cmd1 和 root cmd_1 想要都執行一個 subCommand 就需要這樣
Aliases []string
// 由于不強制設置,用于輸入錯誤的時候建議字段
SuggestFor []string
// 這個就是在 help 的時候一句話描述這個命令的功能
Short string
// 詳細描述這個命令的功能
Long string
// 例子,調用示例
Example string
// 參數白名單(非 flag),只允許傳這里定制的參數
// 此處的參數被被自動補全
ValidArgs []string
// 參數驗證器(可設置不接受參數,或者最多、最少參數)
Args PositionalArgs
// 參數別名
ArgAliases []string
// 自動補全的命令設置,只能在 root 命令設置
BashCompletionFunction string
// 如果這個命令已經廢棄了,那么就這里寫上廢棄信息
Deprecated string
// 如果這個命令要被隱藏,設置這個字段
Hidden bool
// 設置命令分組注釋
Annotations map[string]string
// 設置命令的版本
Version string
// The *Run 函數運行順序:
// * PersistentPreRun()
// * PreRun()
// * Run()
// * PostRun()
// * PersistentPostRun()
// 會被子命令繼承的前置 Run
PersistentPreRun func(cmd *Command, args []string)
// 會被子命令繼承的前置 Run, 帶 error
PersistentPreRunE func(cmd *Command, args []string) error
// 當前這個命令的前置 Run
PreRun func(cmd *Command, args []string)
// 當前這個命令的前置 Run,帶 Error
PreRunE func(cmd *Command, args []string) error
// zh: 實際跑的時候運行的函數
Run func(cmd *Command, args []string)
// zh: Run 執行錯誤了之后
RunE func(cmd *Command, args []string) error
// 后置運行
PostRun func(cmd *Command, args []string)
// 后置運行,帶 error
PostRunE func(cmd *Command, args []string) error
// 會被子命令繼承的后置運行
PersistentPostRun func(cmd *Command, args []string)
// 會被子命令繼承的后置運行,帶 error
PersistentPostRunE func(cmd *Command, args []string) error
// 是否要打印錯誤信息
SilenceErrors bool
// 是否關閉使用建議(當命令不存在,或參數有誤時)
SilenceUsage bool
// 是否有 flag,如果這個命令沒有 flag,設置為 true,那么所有的命令后面的參數都會是 arguments
DisableFlagParsing bool
// 生成文檔時,是否打印自動生成字樣: ("Auto generated by spf13/cobra...")
DisableAutoGenTag bool
// 是否顯示[flags]字樣
DisableFlagsInUseLine bool
// 是否打印建議,當命令行出錯時,匹配字數,然后給出建議的命令,提高用戶體驗
DisableSuggestions bool
// 多少個字才會觸發 suggest,必須大于 0
SuggestionsMinimumDistance int
// 是否使用 Traverse 的方式來解析參數
TraverseChildren bool
// 解析錯誤白名單, 比如像未知參數
FParseErrWhitelist FParseErrWhitelist
}
~~~
## 命令鉤子
重點關注下 cobra 命令的鉤子:
~~~php
// The *Run 函數運行順序:
// * PersistentPreRun()
// * PreRun()
// * Run()
// * PostRun()
// * PersistentPostRun()
// 會被子命令繼承的前置 Run
PersistentPreRun func(cmd *Command, args []string)
// 會被子命令繼承的前置 Run, 帶 error
PersistentPreRunE func(cmd *Command, args []string) error
// 當前這個命令的前置 Run
PreRun func(cmd *Command, args []string)
// 當前這個命令的前置 Run,帶 Error
PreRunE func(cmd *Command, args []string) error
// zh: 實際跑的時候運行的函數
Run func(cmd *Command, args []string)
// zh: Run 執行錯誤了之后
RunE func(cmd *Command, args []string) error
// 后置運行
PostRun func(cmd *Command, args []string)
// 后置運行,帶 error
PostRunE func(cmd *Command, args []string) error
// 會被子命令繼承的后置運行
PersistentPostRun func(cmd *Command, args []string)
// 會被子命令繼承的后置運行,帶 error
PersistentPostRunE func(cmd *Command, args []string) error
~~~
- 序言
- 基礎
- 安裝GoHub
- 目錄結構
- 開發規范
- 部署項目
- 架構
- 架構總覽
- 生命周期
- 配置
- 配置介紹
- 配置目錄
- 配置格式
- 配置加載
- 讀取配置
- 動態配置
- 環境變量配置
- 路由
- 路由模式
- 路由定義
- 路由參數
- 路由分組
- 路由限流
- 路由拆分
- 控制器
- 控制定義
- 控制器初始化
- 中間件
- Make創建控制器
- 請求
- 請求信息
- 數據庫
- 連接數據庫
- 基本使用
- Make創建模型
- 日志
- 介紹
- 日志驅動
- 日志寫入
- HTTP日志
- 數據庫請求日志
- 錯誤和調試
- Debuger調試器
- 驗證
- 驗證器
- 驗證規則
- Make創建驗證器
- 雜項
- 緩存
- 分頁
- 驗證碼
- CURL請求
- 命令行
- 基礎知識
- console 包
- Cobra 基礎
- 命令行模式
- 附錄
- 配置參考
- 第三方依賴庫