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._);