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

一般的な Golang ライブラリ cobra

藏色散人
藏色散人転載
2021-05-13 11:53:282624ブラウズ

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 までご連絡ください。