commander.jsはnode.jsを使ったコマンドラインツールを開発する際のコマンドラインオプション処理を簡単に記述できるモジュールですが、自動で追加されるversionオプションの仕様が自分好みではなかったためカスタマイズしました。
自分好みでない点
1点目:バージョン表示用のオプションが-v
ではなく-V
な点
commander.jsのデフォルトでは、
1 2 3 |
$ node myapp.js -V 0.0.1 |
といったように、大文字の-V
オプションでバージョン情報が表示されるが、小文字の-v
オプションの方がなんとなく好みです。nodeやnpmコマンドも小文字の-v
オプションですし統一されている方が気持ちいいというのもあります。
(もう1つのオプションの--version
については他コマンドと共通なので特に問題なし)
解決策
commander自体にオプション文字列の変更機能があるため、これを利用します。
モジュールの解説ではversionメソッドにバージョン情報のみを指定する例となっていて気づかなかったのですが、第2引数にコマンドラインオプション文字列を指定すれば、デフォルトのオプション文字列を変更できます。
自分好みにするため、以下のように指定しました。
1 2 3 4 5 6 7 8 9 |
#!/usr/bin/env node var myapp = require('myapp.js'); var program = require('commander'); program .version('0.0.1', '-v, --version'); .parse(process.argv); |
こうすることで、デフォルトの-V
ではなく-v
でバージョンを表示できるようになります。
1 2 3 |
$ node myapp.js -v 0.0.1 |
2点目:バージョンをpackage.jsonとソースコードの両方に記載する点
通常、node製アプリのバージョンはpackage.jsonのversion項目で指定します。commanderを使う場合には、commanderモジュールに対してバージョンを設定するために、アプリのソースコードにもバージョンを記載する必要がでてきます。こうなると2ヶ所のバージョン記載を管理し続けるとともに修正漏れにも気を付ける必要があります。
解決策
ソースコードにバージョンをハードコーディングせず、package.jsonを参照して値を設定するようにします。
以下のようにします。
1 2 3 4 5 6 7 8 9 10 |
#!/usr/bin/env node var myapp = require('myapp.js'); var program = require('commander'); var mypackage = require('package.json'); program .version(mypackage.version, '-v, --version') .parse(process.argv); |
こうすることで、package.jsonを修正するだけで、commanderでのバージョン表示が追従するようになります。