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._);
  1. トップ
  2. tech
  3. minimist でサブコマンド付きコマンドを実装する






福島の会津のほうにある大内宿。会津若松と日光を繋ぐ街道の宿場だったところ。古い街並みが残っていて珍しい (一旦近代化でトタン屋根になったりしたようだが復元したらしい)

5時ぐらいに着いたのでお店などは閉まっていた。奥の高台から街全体が見渡せる。神社がちょっと離れたところにあったが時間がないので行けなかった。

  1. トップ
  2. photo
  3. 大内宿






塔のような形の変な岩がいくつも連なっている地形のところ。一部に吊り橋が渡してある。水面近くの窪みの連なりは岩をめぐるために人力で掘ったものらしいが、吊り橋付近以外は現在は歩けないようになっていた。

というか歩けるところも柵とかはなくて、すぐ下が川なのでかなり怖い。奥のほうに小さいお堂がある。

  1. トップ
  2. photo
  3. 塔のへつり