目次
用法" >用法
使用 cobra 自带的 cli 工具 生成项目" >使用 cobra 自带的 cli 工具 生成项目
安装 cli 工具" >安装 cli 工具
初始化 Cobra CLI 应用程序" >初始化 Cobra CLI 应用程序
将命令添加到项目" >将命令添加到项目
采用手动进行项目开发" >采用手动进行项目开发
ホームページ バックエンド開発 Golang コブラコマンドライン開発

コブラコマンドライン開発

Aug 04, 2023 pm 05:59 PM
コブラ図書館

質問

インターネット上でコブラに関する多くの開発情報を見つけました。公式サイトのチュートリアルは非常に参考にならないので、プロジェクト開発後は自分でcobra開発チュートリアルを書く準備をしてください。

Cobra の概要

Cobra は、強力な最新の CLI を作成するためのシンプルなインターフェイスを提供するライブラリです。インターフェイスは似ています。 git と go ツールへ。

コブラが提供するもの:

  • 単純なサブコマンドベースの CLI: app serverapp fetch など。
  • 完全準拠の POSIX フラグ (短いバージョンと長いバージョンを含む)
  • ネストされたサブコマンド
  • グローバル、ローカルおよびカスケード フラグ
  • 賢明なアドバイス (アプリ サーバー #...つまり アプリ サーバー ?)
    ##コマンドとフラグの自動ヘルプ生成
  • #-h
  • ,
  • --help
    などの自動ヘルプ フラグ認識 アプリケーションのシェルを自動的に生成する オートコンプリート機能 (bash、zsh、fish、powershell)
  • アプリケーションのマニュアル ページを自動的に生成する
  • コマンド エイリアスにより、コマンドを壊さずに変更できます。
  • 独自のヘルプや使用方法などを柔軟に定義できます。
  • 12 要素アプリケーション向けの viper とのオプションのシームレスな統合
  • [1]
インストール

Cobra の使用は簡単です。まず、go get を使用して、ライブラリの最新バージョンをインストールします。

go get -u github.com/spf13/cobra@latest
ログイン後にコピー

次に、アプリケーションに Cobra を含めます: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>import &quot;github.com/spf13/cobra&quot;</pre><div class="contentsignin">ログイン後にコピー</div></div><h2 id="span-style-display-none-span-span-用法-span-span-span"><span style="display: none;"></span><span>用法</span><span></span></h2><h3 id="span-style-display-none-span-span-使用-cobra-自带的-cli-工具-生成项目-span-span-style-display-none-span"><span style="display: none;"></span><span>使用 cobra 自带的 cli 工具 生成项目</span><span style="display: none;"></span></h3><h4 id="span-style-display-none-span-span-安装-cli-工具-span-span-style-display-none-span"><span style="display: none;"></span><span>安装 cli 工具</span><span style="display: none;"></span></h4><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>go install github.com/spf13/cobra-cli@latest</pre><div class="contentsignin">ログイン後にコピー</div></div><p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">使用方式</p><ol class="list-paddingleft-1" data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;"><li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">创建一个新的文件夹</section></li><li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"><code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;">cd 到这个文件夹里面去

  • 运行 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]

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

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

    以上がコブラコマンドライン開発の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    Debian OpenSSLの脆弱性は何ですか Debian OpenSSLの脆弱性は何ですか Apr 02, 2025 am 07:30 AM

    OpenSSLは、安全な通信で広く使用されているオープンソースライブラリとして、暗号化アルゴリズム、キー、証明書管理機能を提供します。ただし、その歴史的バージョンにはいくつかの既知のセキュリティの脆弱性があり、その一部は非常に有害です。この記事では、Debian SystemsのOpenSSLの共通の脆弱性と対応測定に焦点を当てます。 Debianopensslの既知の脆弱性:OpenSSLは、次のようないくつかの深刻な脆弱性を経験しています。攻撃者は、この脆弱性を、暗号化キーなどを含む、サーバー上の不正な読み取りの敏感な情報に使用できます。

    PPROFツールを使用してGOパフォーマンスを分析しますか? PPROFツールを使用してGOパフォーマンスを分析しますか? Mar 21, 2025 pm 06:37 PM

    この記事では、プロファイリングの有効化、データの収集、CPUやメモリの問題などの一般的なボトルネックの識別など、GOパフォーマンスを分析するためにPPROFツールを使用する方法について説明します。

    Goでユニットテストをどのように書きますか? Goでユニットテストをどのように書きますか? Mar 21, 2025 pm 06:34 PM

    この記事では、GOでユニットテストを書くことで、ベストプラクティス、モッキングテクニック、効率的なテスト管理のためのツールについて説明します。

    GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

    GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

    Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

    Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

    フロントエンドからバックエンドの開発に変身すると、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モジュールの依存関係の管理、仕様、更新、競合解決をカバーすることについて説明します。セマンティックバージョンや定期的な更新などのベストプラクティスを強調しています。

    GOでテーブル駆動型テストをどのように使用しますか? GOでテーブル駆動型テストをどのように使用しますか? Mar 21, 2025 pm 06:35 PM

    この記事では、GOでテーブル駆動型のテストを使用して説明します。これは、テストのテーブルを使用して複数の入力と結果を持つ関数をテストする方法です。読みやすさの向上、重複の減少、スケーラビリティ、一貫性、および

    See all articles