高速にGo言語のCLIツールをつくるcli-initというツールをつくった

tcnkms/cli-init・GitHub

cli-initを使えば,Go言語コマンドラインツール作成時のお決まりパターンをテンプレートとして自動生成し,コア機能の記述に集中することができる.

デモ

以下は簡単な動作例.

上のデモでは,addlistdeleteというサブコマンドをもつtodoアプリケーションを生成している.生成結果は,tcnksm/sample-cli-initにある.

背景

Go言語で作られたコマンドラインツールを見ていると,codegangsta/cliというパッケージがよく使われている.

これは,コマンドラインツールのインターフェースを定義するためのライブラリで,これを使えば,サブコマンドをもつコマンドラインツールを簡単につくることができる(Usageを自動で生成してくれたり,bash補完関数をつくれたりするという便利機能もある).

これを使って,自分もGo言語でコマンドラインツールをいくか作ってみた(e.g., Dockerとtmuxを連携するdmuxというツールをつくった).で,自分で書いたり,他のプロジェクトを参考にしたりすると,codegangsta/cliを使ったプロジェクトは同様のパターンで記述されていることに気づいた.

このパターンを毎回記述するのはダルいので,それを自動生成することにした.

使い方

使い方は以下.

$ cli-init [options] application

例えば上のデモの場合は以下のようにしている.

$ cli-init -s add,list,delete todo

-sでサブコマンドを指定し,最後に作りたいコマンドラインアプケーションの名前を指定するだけ.

生成されるファイル

例えば,上記のコマンドでは以下のファイルが生成される.

  • todo.go
  • commands.go
  • version.go
  • README.md
  • CHANGELOG.md

まず,todo.goの中身は以下.

func main() {
    app := cli.NewApp()
    app.Name = "todo"
    app.Version = Version
    app.Usage = ""
    app.Author = "tcnksm"
    app.Email = "[email protected]"
    app.Commands = Commands
    app.Run(os.Args)
}

ここには,main()関数が生成され,その中でアプリケーションの基本的な情報が記述される.AuthorEmail.gitconfigVersionversion.goの値が使われる.Usageの中身だけ自分で記述する.

次に,commands.goには,サブコマンドの定義が記述される.例えば,サブコマンドlistに対しては,以下が生成される.

var commandList = cli.Command{
    Name:  "list",
    Usage: "",
    Description: `
`,
    Action: doList,
}

func doList(c *cli.Context) {
}

UsageDescription,そして,doList()関数(listの実際の挙動)だけ自分で記述する.他のオプションなどは,codegangsta/cliのREADMEを参照.

あとは,README.mdCHANGELOG.mdのテンプレートも生成される.

インストール

Go言語がインストールされていることを前提にしている.

$ go get -d github.com/tcnksm/cli-init
$ cd $GOPATH/src/github.com/tcnksm/cli-init
$ make install

まとめ

たいしたことはしていない.基本は,codegangsta/cliで記述するべきこと,パターンに沿ってファイルを生成しているだけ.それだけだが,かなり記述量を減らすことができる.

バグや意見は,GitHubのIssueもしくは,@deeeetまでお願いします.

あわせて読みたい