ホームページ > バックエンド開発 > Golang > 一般的な Golang ライブラリ cobra

一般的な Golang ライブラリ cobra

藏色散人
リリース: 2021-05-13 11:53:28
転載
2647 人が閲覧しました

golang の次のチュートリアル コラムでは、一般的な golang ライブラリである cobra について紹介します。困っている友人の役に立てば幸いです。

cobra は、コマンド ライン ツールの作成に使用できる Go 言語のライブラリです。通常、

git pulldocker container start apt install などのコマンドが表示されますが、これらは corba で簡単に実装できます。バイナリ ファイルにコンパイルするのが簡単です。この記事では、単純なコマンド ライン ツールを実装します。

具体的な例を書き、4 つのサブコマンドを持つ

blog というコマンドを設計します。

 blog new [post-name] :创建一篇新的blog
 blog list   :列出当前有哪些文章
 blog delete [post-name]: 删除某一篇文章
 blog edit [post-name]:编辑某一篇文章
ログイン後にコピー
計画には次の手順があります

    create Module
  • cobra のコマンド ラインを使用してコマンド ライン エントリを作成します
  • cobra のコマンド ラインを使用してサブコマンドを作成します
  • 関数ロジックを作成します
Create a module

$ go mod init github.com/shalk/blog
go: creating new go.mod: module github.com/shalk/blog
ログイン後にコピー

コマンド ライン エントリの作成

コマンド ラインと言えば、さまざまなスタイルのコマンド ラインを解析できる bash の getopt や Java の jcommand を思い浮かべるかもしれませんが、通常はこれらのコマンド ラインが決まった書き方があり、この書き方が覚えられない場合は、テンプレートを探して以下を参考にするのが一般的です。コマンドラインの解析に加えて、cobra はテンプレートを生成できるコマンドラインも提供します。まずこのコマンド ラインをインストールし、ライブラリの依存関係を go.mod に追加します。

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

$GOPATH\bin ディレクトリにインストールされます。

$ cobra init --pkg-name github.com/shalk/blog -a shalk -l mit
Your Cobra applicaton is ready at
D:\code\github.com\shalk\blog
ログイン後にコピー
ディレクトリ構造は次のとおりです:

./cmd
./cmd/root.go
./go.mod
./go.sum
./LICENSE
./main.go
ログイン後にコピー
コンパイルします

go build  -o blog .
ログイン後にコピー
実行します

$blog -h
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.
ログイン後にコピー
コマンドラインが作成されます。理解が深まると、生成されたコードを後で調整する必要があるため、コブラコードのルーチンを理解する必要があるため、コードを 1 行も記述する必要はないようです。

Cobra コード ルーチン

コマンド、フラグ、引数という 3 つの概念があります。例:

go get -u test.com/a/b
ログイン後にコピー
ここでは get が一般的 (これはより特殊です)、-u はflag, test.com/a/b は args

コマンド ラインは 3 つの部分で構成されているため、

    コマンド自体の基本情報を定義する必要があります。 command で表される特定のオブジェクト cobra.Command
  • コマンドの一部の機能またはオプションであり、flag で表されます 特定のオブジェクトは、flag.FlagSet
  • の最後のパラメータです。 by args, 通常 []string
別の概念はサブコマンドです。たとえば、get は go のサブコマンドです。これはツリー構造の関係です。

go コマンドを使用することも、go get コマンドを使用することもできます

例: root.go は root コマンドを定義し、init 内のフラグも定義します。実行される場合は、「実行」フィールドに入力するだけです。

// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
	Use:   "blog",
	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) { },
}

// Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() {
	if err := rootCmd.Execute(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

func init() {
	cobra.OnInitialize(initConfig)

	// Here you will define your flags and configuration settings.
	// Cobra supports persistent flags, which, if defined here,
	// will be global for your application.

	rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.blog.yaml)")

	// Cobra also supports local flags, which will only run
	// when this action is called directly.
	rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")

}
ログイン後にコピー
サブコマンドが必要な場合は、init で rootCmd.AddCommand() に他のコマンドを指定する必要があります。他のサブコマンドは通常、別のファイルに書かれており、rootCmd が追加できるようにグローバル変数を持っています

サブコマンドの作成

D:\code\github.com\shalk\blog>cobra add  new
new created at D:\code\github.com\shalk\blog

D:\code\github.com\shalk\blog>cobra add  delete
delete created at D:\code\github.com\shalk\blog

D:\code\github.com\shalk\blog>cobra add  list
list created at D:\code\github.com\shalk\blog

D:\code\github.com\shalk\blog>cobra add  edit
edit created at D:\code\github.com\shalk\blog
ログイン後にコピー

New.go、delete.go、list.go、edit.go

関数コードの追加

new.go

var newCmd = &cobra.Command{
	Use:   "new",
	Short: "create new post",
	Long:  `create new post `,
	Args: func(cmd *cobra.Command, args []string) error {
		if len(args) != 1 {
			return errors.New("requires a color argument")
		}
		return nil
	},
	Run: func(cmd *cobra.Command, args []string) {
		fileName := "posts/" + args[0]
		err := os.Mkdir("posts", 644)
		if err != nil {
			log.Fatal(err)
		}
		_, err = os.Stat( fileName)
		if os.IsNotExist(err) {
			file, err := os.Create(fileName)
			if err != nil {
				log.Fatal(err)
			}
			log.Printf("create file %s", fileName)
			defer file.Close()
		} else {
		}
	},
}
ログイン後にコピー
list.go

var listCmd = &cobra.Command{
	Use:   "list",
	Short: "list all blog in posts",
	Long: `list all blog in posts `,
	Run: func(cmd *cobra.Command, args []string) {
		_, err := os.Stat("posts")
		if os.IsNotExist(err) {
			log.Fatal("posts dir is not exits")
		}
		dirs, err := ioutil.ReadDir("posts")
		if err != nil {
			log.Fatal("read posts dir fail")
		}
		fmt.Println("------------------")
		for _, dir := range dirs {
			fmt.Printf(" %s\n", dir.Name() )
		}
		fmt.Println("------------------")
		fmt.Printf("total: %d blog\n", len(dirs))

	},
}
ログイン後にコピー
delete.go

var deleteCmd = &cobra.Command{
	Use:   "delete",
	Short: "delete a post",
	Long: `delete a post`,
	Args: func(cmd *cobra.Command, args []string) error {
		if len(args) != 1 {
			return errors.New("requires a color argument")
		}
		if strings.Contains(args[0],"/") || strings.Contains(args[0],"..") {
			return errors.New("posts name should not contain / or .. ")
		}
		return nil
	},
	Run: func(cmd *cobra.Command, args []string) {
		fileName := "./posts/" +  args[0]
		stat, err := os.Stat(fileName)
		if os.IsNotExist(err) {
			log.Fatalf("post %s is not exist", fileName)
		}
		if stat.IsDir() {
			log.Fatalf("%s is dir ,can not be deleted", fileName)
		}
		err = os.Remove(fileName)
		if err != nil {
			log.Fatalf("delete %s fail, err %v", fileName, err)
		} else {
			log.Printf("delete post %s success", fileName)
		}
	},
}
ログイン後にコピー
edit.go これは少し面倒です。vim などのプログラムを呼び出してファイルを開くと、golang プログラム自体が必要になるからです。切り離して終了します。今は脇に置いておきましょう (TODO)

コンパイルとテスト

ウィンドウでテストしていますが、Linux の方が簡単です

PS D:\code\github.com\shalk\blog> go build -o blog.exe .
PS D:\code\github.com\shalk\blog> .\blog.exe list
------------------
------------------
total: 0 blog
PS D:\code\github.com\shalk\blog> .\blog.exe new blog1.md
2020/07/26 22:37:15 create file posts/blog1.md
PS D:\code\github.com\shalk\blog> .\blog.exe new blog2.md
2020/07/26 22:37:18 create file posts/blog2.md
PS D:\code\github.com\shalk\blog> .\blog.exe new blog3.md
2020/07/26 22:37:20 create file posts/blog3.md
PS D:\code\github.com\shalk\blog> .\blog list
------------------
 blog1.md
 blog2.md
 blog3.md
------------------
total: 3 blog
PS D:\code\github.com\shalk\blog> .\blog delete blog1.md
2020/07/26 22:37:37 delete post ./posts/blog1.md success
PS D:\code\github.com\shalk\blog> .\blog list
------------------
 blog2.md
 blog3.md
------------------
total: 2 blog
PS D:\code\github.com\shalk\blog> ls .\posts\


    目录: D:\code\github.com\shalk\blog\posts


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        2020/7/26     22:37              0 blog2.md
-a----        2020/7/26     22:37              0 blog3.md


PS D:\code\github.com\shalk\blog>
ログイン後にコピー
概要

cobra は効率的なコマンド ライン 解析ライブラリは、cobra のスキャフォールディングを使用してコマンド ライン ツールを迅速に実装します。より詳細な制御が必要な場合は、cobra の公式ドキュメントを参照してください。

以上が一般的な Golang ライブラリ cobraの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート