Node.js:コマンドラインオプションを処理する

js-opts というモジュールが使える。
npm でインストール。

^o^ > npm install opts
[email protected] node_modules\opts

js-opts というモジュール名だけど、インストールするのは opts。

昨日のファイル一覧を表示するスクリプトを拡張してみた。

var fs = require('fs');
var opts = require('opts');

var ext = false;

var options = [
  { short: "v"
  , long: "version"
  , description: "Show version and exit"
  , callback: function() { console.log("v0.1.0"); process.exit(1); }
  },
  { short: "e"
  , long: "ext"
  , description: "Specify ext"
  , value: true
  , callback: function(value) { host = value; }
  }
]

opts.parse(options, true);

var ext = opts.get("ext");
var dir = opts.args()[0];

fs.readdir(dir, function(err, files) {
  if (err) throw err;
  files = files.filter(function(file) {
    return fs.statSync(file).isFile();
  });
  if (ext) {
    var re = new RegExp(".+\." + ext + "$");
    files = files.filter(function(file) {
      return re.test(file);
    });
  }
  files.forEach(function(file) {
    console.log(file);
  });
});

オプションをオブジェクトの配列として定義しておいて、opts.parse の引数に渡してやると、オプション解析をしてくれる。true はなんだろう?

オプションの引数は opts.get(オプション名) で取得できる。それから、解析の結果残った引数は opts.args() で配列として取得できる。

実行結果:

^o^ > node listfiles2.js --version
v0.1.0

^o^ > node listfiles2.js --help
Usage: node C:\Users\takatoh\Documents\w\nodejs\listfiles2.js [options]
Show this help message
    --help
Specify ext
    -e, --ext 
Show version and exit
    -v, --version


^o^ > node listfiles2.js .
config.json
filesize.js
get_file.js
get_file2.js
hello.js
hello.txt
httphead.js
listfiles.js
listfiles2.js
read_config.js
server.js
test_argv.js
test_url.js

^o^ > node listfiles2.js --ext js .
filesize.js
get_file.js
get_file2.js
hello.js
httphead.js
listfiles.js
listfiles2.js
read_config.js
server.js
test_argv.js
test_url.js

–help オプションは定義しなくても、自動で作ってくれるみたい。

js-opts のサイト:

 cf. https://bitbucket.org/mazzarelli/js-opts/wiki/Home

[追記]

js-opts のソースを確認したところ、opts.parse の第2引数に true を指定すると、–help オプションを追加してくれるみたい。

カテゴリー: JavaScript パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください