<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 底層庫的選擇 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 ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看