minimist でサブコマンド付きコマンドを実装する
node.js 用のコマンドラインパーサである minimist は必要最低限かつわかりやすくていいですね。
しかもサブコマンド用のオプションも用意されているので、ある程度複雑でも耐えられます。
以下がサブコマンドを実装したもののサンプルコードです。ポイントは親コマンド側では stopEarly を指定して、サブコマンド用の引数を解釈させないところです。
そのうえであらためてサブコマンド用の引数を minimist にかけることで必要な機能が実現できます。良いですね。
#!/usr/bin/env node
import * as minimist from "minimist";
const commands : { [key: string]: (argv: any[]) => void } = {
foobar : function (_argv: any[]) {
const argv = minimist(_argv, {
boolean: true,
alias: {
"o": "output",
"h": "help",
}
});
console.log(argv);
}
};
const argv = minimist(process.argv.slice(2), {
stopEarly: true, // do not parse subcommand args
boolean: true,
alias: {
"h": "help",
}
});
const subcommand = argv._.shift() as string;
if (!subcommand || argv.help) {
console.log('Options:');
console.log(' -h --help: show help');
console.log('Sub commands:');
process.exit(argv.help ? 0 : 1);
}
const func = commands[subcommand];
if (!func) {
console.warn(`Unknown subcommand ${subcommand}`);
process.exit(1);
}
func(argv._);
関連エントリー
- ブログシステムの HTML 生成を効率化 そろそろやることなくなったので minify などをやることにしました。 ただ、ブログシステムの出力の最後ほうでページごとに全体を mini...
- mbed USBSerial を WebUSB から扱うには mbed USBDevice ライブラリの中に USB CDC で動く USBSerial クラスが実装されている。これを Web USB ...
- Benchmark.js の結果表示を改善する Benchmark.js ちゃんと使えるので良いのですが、計測を頑張っている割に結果表示が貧弱というのが悲しいところです。 なので Perl...
- Node.js の fs モジュールだけで GPIO の割込みを扱うには? 以下のようにすれば動くことが確認できた。 select や poll を明示的に呼び出すことができないが、edge を設定しさえすれば fs...
- Math.random を seed 付きに置き換える こういう感じのコードをコピペする。本体は xorshift128、seed から初期値を xorshift32 で設定する (seed をそ...