minimist

Node.jsでCLIツールを作る時に使えるコマンドライン・オプションのパーサーとしてminimistをよく使うようになった。なかなかの好感触。同様のものとしてoptimistやその後継のyargsが有名で、しっかりと作るならそっちの方がよく出来ているけど、数個のオプションの切り替えと余りの抽出くらいならminimistの方が楽。

インストールしたら以下のようにパースしたいコマンドライン・オプションの配列を渡すと、良きに計らってくれたオブジェクトが返ってくるので、それを使うことになる。

#!/usr/bin/env node

'use strict';

var minimist = require('minimist');

var argv = minimist(process.argv.alice(2), {
  string: ['output'],
  boolean: [
    'sourcemap',
    'help',
    'version'
  ],
  alias: {
    h: 'help',
    o: 'output',
    v: 'version'
  },
  default: {
    sourcemap: false,
    help: false,
    version: false
  }
});

やってくれるのはそれだけなので、例えばyargsではメソッドチェーンで書ける使い方の例示などは自分でゴリゴリ書くことになる。逆に言うとそういうのをあまり必要としなかったり、オプションを複雑に組み合わせて実行しないようなCLIツールを書くのに向いているということになる。

stringとboolean
配列で指定したオプション名の値を、文字列または真偽値として必ず解釈されるようにする。
alias
短いバージョンのコマンドの定義に主に使う。短いバージョンをキーに、参照先を値にして指定し、パース結果のオブジェクトでは参照先のみにまとめられる。
default
それぞれのコマンドライン・オプションが省略された時にデフォルトの値として設定される値を設定する。

余った引数や--以降のコマンドライン・オプションはargv._に全て格納されるので、それは自分でどうにかする必要があり、自分でどうにでも出来る。


こういったCLIツールのためのコマンドライン・オプションのパーサー・ライブラリは、以下のようなゆらぎのある指定を同一視してくれるとツール自体が書きやすいだけでなく、利用するユーザーにも利便性がある。

$ foo --output=out.txt
$ foo -o out.txt

こういう点でminimistはやり過ぎない程度にうまく出来ていて、かつ習得が容易で良いと感じた。なんとなくで使える。余った引数もうまいことしてくれるので色々面倒くさくなくて良かった。