最近はよくCLIのツールを作る。CLIツールと言えばオプションの解析処理だ。実際は最近だと何でもかんでもサブコマンドで作っていくから、サブコマンドの指定、グローバルオプション、サブコマンドごとのオプション、という解析が必要になる。
古くはGNU getoptの一強という時代があった。C言語だと今でもこいつなんじゃないかな。ただサブコマンドを書けないんじゃないかと思う。CやC++を使ってた頃はサブコマンド作る習慣がなかったもので…
時代は下り、数年前だとRubyのthorかGolangのcodegangsta(現urfave。どっちにしてもすごい名前だね)のcliをよく使っていた。いずれもサブコマンドを快適に使える。ついでにサブコマンドのみを使ってサブコマンドやオプションを補完してくれるREPLまで用意してくれればいいのだけど、、、と思って作ったのが→ github.com/wtnb75/go-cmdrepl だが、これcodegangsta時代のやつだな。今度urfaveに変えとこう。
仕事になるとCLIツールの作成をRubyかGolangで、というわけにも行かなくて、ごく最近だとPythonのClickやJavaのargs4jを使っている。言語の制約というのはどうしてもあるんですね。ライブラリとしてはthorやClickやargs4jは世代が新しいような感じ。今となってはurfave/cliはちょっと負けてるような気がする。せっかくGolangなら、structのメンバのtagで書かなきゃだよね。こんな感じのイメージ↓です。
type Args struct { Filename string `arg:"-f,--filename,help=your file name"` Verbose bool `arg:"-v" }
このくらい、自分で作ってみようかな…サブコマンドはどう表現しようか?
あとは…他にちょくちょく使う言語としてはnodejsがあるけど、commanderとかyargsというのがあるらしい。今度機会があれば使ってみようと思う。
(追記)
Golangの第2世代はgo-flagsってのがあるみたいですね。かなり便利そうな外観をしている。今度GolangでCLIツールを作る機会があったらこっちにしよう。