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. 塔のへつり

そういえばbuilderscon tokyo 2017に参加してました。今回はスピーカーやらず (応募してない)、個人スポンサーだけです。(応募しなかったのは日記を読みかえしても特に話せる内容がなかったからで、特に他の事情はない)

ただ2日目の午前中に調子悪くなって帰ってしまった。そして14時から19時ぐらいまで寝てたので、起きたらベストスピーカーとか決まってた感じだった。

やっぱ3Dプリンタで作る1次元セル・オートマトン、階差機関、アナログコンピュータ - builderscon tokyo 2017が面白かったかな〜。階差機関ってものをそもそも知らなかったのと、温故知新を流行り(3Dプリンタ)に絡ませるみたいな感じが良かった。

あと非公開だった前夜祭が面白かった。撤退技術ということで、トラブルとかうまくいかなかったという話が中心で、しかも実働サービスでのことが主軸だったけど、こういうのは語り口を間違えばなかなかやっかいなはずだと思うので、登壇するのは大変勇気がいることだなあと思った。


あとは会場でコード書くと捗るのでずっとコード書いてた。