node.jsのいろいろなモジュール7 – js-optsでコマンドライン引数を使う

2011.10.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

optsを使ってコマンドライン引数を使う

node.jsで、プログラム実行時にコマンドライン引数を渡して実行したい場合、みなさんはどうしていますか?
process.argv変数を参照すれば指定された引数を取ることができますが、js-optsモジュール ※1を使用すればもっと簡単に行うことができます。
今回はコマンドライン引数を扱うためのjs-optsについてご紹介します。

インストール

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.1
  • Node.js : v0.4.11
  • npm : 1.0.30

ではnpmを使用してインストールしましょう。

% npm install opts

インストールできたらnpmコマンドで確認します。

%npm list
/path/your/app
└── opts@1.2.1  extraneous

インストールできたので、サンプルを動かしてみましょう。

サンプルを動かしてみる

公式サイトにもあるExample1を動かしてみます。
このサンプルは-vか--versionでバージョン情報を表示して終了します。 普通に実行した場合は通常の処理だけを実行して終了します。

var opts = require('opts');

var options = [
  { short       : 'v'
  , long        : 'version'
  , description : 'Show version and exit'
  , callback    : function () { console.log('v1.0'); process.exit(1); }
  }
];

opts.parse(options, true);
console.log('Example 1');
process.exit(0);

optsモジュールを読みこみ、parse関数でコマンドライン引数のパースを実施しています。
parseに渡すoptionsオブジェクトで、引数のパラメータや処理を記述しています。
実行結果は下記のようになります。

%node test.js
Example 1
%node test.js -v
v1.0
%node test.js --version
v1.0
%node test.js --help
Usage: node /path/your/app/test.js [options]
Show this help message
    --help
Show version and exit
    -v, --version
%node test.js -x test
Unknown option: -x
Try --help

指定した以外のパラメータはエラーになりますが、例外的に--helpオプションだけはデフォルトで用意されています。

もうひとつサンプルを作成してみます。
このサンプルでは指定したポート番号でhttpサーバーを起動するようにしてみます。

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

opts.parse([
    {
        'short': 'p',
        'long': 'port',
        'description': 'port number',
        'value': true,
        'required': false
    },
]);

var port = opts.get('port') || 3000;

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(port, "127.0.0.1");
console.log('Server running at http://127.0.0.1:' + port);

opts.get関数を使用して、指定されたportオプションを取得して、その番号で起動しています。

%node test.js -p 3939
Server running at http://127.0.0.1:3939

まとめ

今回はコマンドライン引数を楽に扱えるモジュールを紹介させていただきました。
1つのアプリケーションを別ポートで複数台立ち上げたい場合などは手軽に扱えて便利だと思います。

参考サイトなど