銀の弾丸

プログラミングに関して、いろいろ書き残していければと思っております。

npm 「hash-arg」 ― コマンドラインパラメータに名前でアクセス

コマンドラインで指定されたパラメータに名前でアクセスする為の、シンプルなNode.jsのモジュール hash-argをnpmで公開したので御紹介します。

npm便利ですね。若干敷居が高い気がしていましたが、まずはいろんなモジュールを検索して使うところから始めるといいですね。

f:id:takamints:20160403163627p:plain

'hash-arg'コマンドラインパラメータに名前でアクセスするためのシンプルなnpmモジュールです。

www.npmjs.com

ソースはGitHibに置いています。

github.com


JavaScript 第6版
JavaScript 第6版
posted with amazlet at 16.04.03
David Flanagan
オライリージャパン
売り上げランキング: 16,569

はじめに

このモジュールは、コマンドラインオプションの処理をするものではありません

単純に、コマンドライン引数、または配列の各要素に、前から順に名前を付けてハッシュ(JavaScriptのobject)を返すモジュールです。 追加の機能として、各パラメータの型指定と、省略時の既定値の指定ができますが、基本的には単純なものです。

Node.jsのコマンドラインパラメータは、process.argv[2] 以降に文字列として格納されています([0][1]"node"と、スクリプト名)から、本モジュールにパラメータの定義(名前、型、既定値)だけを与えた場合は、process.argv[2]以降の要素を処理対象とします。 別の配列を与えた場合は、すべての要素を処理します。

オプションが含まれる場合

コマンドライン引数に'-'で始まるようなオプションを含ませたい場合は、先にnode-getoptのようなオプションのパーサーで処理しておいて、そのモジュールが(おそらく)提供している、「オプションではない引数の配列」を、当モジュールで処理させます。

少しだけ気楽になるモジュールです(多分)

オプションではない引数が配列に入っている場合、その要素数をチェックして、必要なパラメータが足りていなかったりすると、エラーにしたり、省略時の既定値を設定したりしますよね。これって、少し邪魔くさい。

本来ザクザク書きたいのはそういうところじゃないはずです。 どの位置に何が指定されていたのか?という情報は、その後、使わない情報ですし。

あと、最初のパラメータなのにprocess.argv[2]とか書いちゃうあの妙な違和感(笑)もどうにかできます。

使い方:単純に'process.argv'を使用する場合

唯一のメソッドgetの第一引数にパラメータ名の定義を与えて呼び出せば、process-argvから値を取り出し、オブジェクトの指定されたキーに値を格納して返します。 (第二引数は省略可能なパラメータの配列です)

simple.js

args = require("hash-arg").get(
        "inputFilePath outputFilePath");
 
console.log(JSON.stringify(args, null, "  "));

実行例:

$ node test/simple.js input.json output.json
{
  "inputFilePath": "input.json",
  "outputFilePath": "output.json"
}

使い方:node-getoptのようなコマンドラインパーサーと共に使用

省略可能な第二引数に、たとえば、node-getoptモジュールの argv プロパティを与えればOK。

with-node-argv.js

getopt = require("node-getopt").create([
    ['s', '', 'short option'],
    ['l', 'long', 'long option'],
    ['S', 'short-with-arg=ARG', 'option with argument']
]).parseSystem();
 
args = require("hash-arg").get([
        "inputFilePath",
        {
            "name":"outputFilePath",
            "default": "out.json"
        }
        ], getopt.argv);
 
console.log(JSON.stringify(args, null, "  "));

実行例:

$ node test/with-node-getopt.js -S DUMMY input.json -sl output.json
{
  "inputFilePath": "input.json",
  "outputFilePath": "output.json"
}

GET メソッド

呼び出し形式

HashArg.get(<argument-def> [, <argv-source-array>]);

argument-def

パラメータの定義を行う。

単一の文字列、または、文字列配列、または、パラメータ定義オブジェクトの配列を指定できる。

1) 文字列の場合

パラメータのキー名称をスペースで区切った文字列

例)

"inputFilePath outputFilePath"

2) Array of string

各要素がパラメーター名である文字列の配列。

例)

["inputFilePath", "outputFilePath"]

3) Array of definition object

このフォーマットでは、省略時のデフォルト値を指定できます。

デフォルト値が指定されていない場合は、nullが使用されます。

[
    {"name":"inputFilePath"},
    {
        "name"      : "outputFilePath",
        "default"   : "out.json"
    }
]

argv-source-array (省略可能)

コマンドラインパラメータを保持する文字列配列。

省略時はprocess.argvが使われます。

※ 注意:v0.0.2以前では、getの第二引数に、process.argvを与えると誤動作します。

定義より多くパラメータが指定されたら

v0.0.3以上では、パラメータ定義の数よりもコマンドラインで指定されたパラメーターが多い場合、未定義のパラメータが、返されるオブジェクトの空文字のキーに配列として保存されます(v0.0.2以前ではそれらは失われていました)。

args = require("hash-arg").get("inputFilePath outputFilePath");
console.log(JSON.stringify(args, null, "  "));

実行例:

$ node test/with-node-getopt.js input.json output.json foo bar
{
  "inputFilePath": "input.json",
  "outputFilePath": "output.json",
  "": ["foo", "bar"]
}

ライセンス

MIT

その他

単に利用するだけなら、npm install hash-argでOKですよ。