CLI作成支援パッケージ Cobra を使い、Go 言語でコマンドラインツールを作ってみる

  • 15
    いいね
  • 0
    コメント

はじめに

Go 言語でコマンドラインツールを作ることができる Cobra というパッケージがあります。僕が最近愛用している hugo も採用したという非常に優れたパッケージです。

Cobra
https://github.com/spf13/cobra

今回はこの Cobra を使って、2つの数字を指定すると足し算を行ってくれる go-keisan というコマンドラインツールを作ってみました。

go-keisan の仕様

本稿で作ろうとしている go-keisan の仕様はこんな感じ。

//バージョン番号を表示
>go-keisan version

//使い方を説明
>go-keisan help

//サブコマンド add で足し算の結果を返す
>go-keisan add 12 34
46

ではさっそく作ってみましょう。

Cobra をゲット

まず go get コマンドで Cobra をゲットします。

go get -v github.com/spf13/cobra/cobra

プロジェクトフォルダを作成

mkdir go-keisan

フォルダ構成

フォルダ構成は以下の通り。

go-keisan/
├ cmd/
│ ├ root.go
│ └ add.go
└ go-keisan.go

go-keisan.go を作成

まず最初に基本的な実行ファイルとなる go-keisan.go ファイルを作成します。

go-keisan.go
package main

import "go-keisan/cmd"

func main() {
    if err := cmd.RootCmd.Execute(); err != nil {
        fmt.Println(err)
        os.Exit(-1)
    }
}

cmd/root.go を作成

次に root.go ファイルを作成します。version などの基本的なサブコマンドはこの中に記述します。

root.go
package cmd

import (
    "fmt"

    "github.com/spf13/cobra"
    "github.com/spf13/viper"
)

var RootCmd = &cobra.Command{
    Use:   "go-keisan",
    Short: "This tool is pretty cool.",
    Long:  "This tool is a great convenience.",
    Run: func(cmd *cobra.Command, args []string) {

    },
}

func init() {
    cobra.OnInitialize()
    RootCmd.AddCommand(versionCmd)
}

var versionCmd = &cobra.Command{
    Use:   "version",
    Short: "Print the version number of go-keisan",
    Long:  `All software has versions. This is go-keisan's`,
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Println("go-keisan v1.0")
    },
}

足し算の処理を作成

次に add というサブコマンドを実行する処理を記述します。

cmd/add.go
package cmd

import (
    "fmt"
    "strconv"

    "github.com/spf13/cobra"
)

func init() {
    RootCmd.AddCommand(addCmd)
}

var addCmd = &cobra.Command{
    Use:   "add",
    Short: "Calculator of addition.",
    Long:  "Calculator to perform the addition.",
    Run: func(cmd *cobra.Command, args []string) {
        var n1 int
        var n2 int
        n1, _ = strconv.Atoi(args[0])
        n2, _ = strconv.Atoi(args[1])
        fmt.Println(n1 + n2)
    },
}

ビルド

いったんビルドします。

go build go-keisan.go

実行

作成したツール go-keisan を実行してみます。

go-keisan help

以下のように、ヘルプの内容が表示されます。

002.png

次に足し算の処理を実行してみましょう。

go-keisan add 7 21

7 + 21 の計算結果である 28 が正しく表示されたはずです。

004.png

おわりに

これで本稿は終わりです。

さて、今回作ったこの足し算ツールには実は大きな欠点があります。
Atoi 関数は変換不能な文字列については 0 を返すので、例えば go-keisan add abcdefg 7 のようにコマンドを打つと、エラーを吐かずに 7 という結果が返ってきてしまうのです。
後で突っ込まれないよう念のため書きました。それではまた。