Node.jsスクリプトでコマンドライン引数を処理する方法
序章
コマンドライン引数は、コマンドに追加の入力を提供する方法です。 コマンドライン引数を使用して、Node.jsスクリプトに柔軟性とカスタマイズを追加できます。
この記事では、引数ベクトル、引数フラグの検出、複数の引数と値の処理、およびcommander
パッケージの使用について学習します。
前提条件
このチュートリアルを実行するには、次のものが必要です。
- Node.jsのローカル開発環境。 Node.jsをインストールしてローカル開発環境を作成する方法に従ってください。
このチュートリアルは、ノードv16.10.0、npm
v7.12.2、およびcommander
v7.2.0で検証されました。
引数ベクトルの使用
Node.jsは、引数vectorと呼ばれる渡された引数のリストをサポートします。 引数ベクトルは、Node.jsスクリプトのprocess.argv
から利用できる配列です。
配列には、Node.js実行可能ファイル、スクリプトのパスとファイル名など、スクリプトに渡されるすべてのものが含まれています。
次のコマンドを実行する場合:
node example.js -a -b -c
引数ベクトルには、次の5つの項目が含まれます。
[ '/usr/bin/node', '/path/to/example.js', '-a', '-b', '-c' ]
少なくとも、引数なしで実行されるスクリプトには、配列内にnode
実行可能ファイルと実行中のスクリプトファイルの2つの項目が含まれます。
通常、引数ベクトルは、渡された引数の数を示す引数カウント(argc
)とペアになっています。 Node.jsにはこの特定の変数がありませんが、引数ベクトル配列のlength
をいつでも取得できます。
example.js
if (process.argv.length === 2) { console.error('Expected at least one argument!'); process.exit(1); }
このサンプルコードは、argv
のlength
をチェックします。 2
の長さは、node
実行可能ファイルとスクリプトファイルのみが存在することを示します。 引数がない場合は、Expected at least one argument!
およびexit
というメッセージが出力されます。
引数フラグの使用
デフォルトのメッセージを表示する例を考えてみましょう。 ただし、特定のフラグが存在する場合は、別のメッセージが表示されます。
example.js
if (process.argv[2] && process.argv[2] === '-f') { console.log('Flag is present.'); } else { console.log('Flag is not present.'); }
このスクリプトは、引数ベクトルに3番目の項目があるかどうかをチェックします。 JavaScriptの配列はゼロインデックスであるため、インデックスは2
です。 3番目の項目が存在し、-f
と等しい場合、出力が変更されます。
引数なしでスクリプトを実行する例を次に示します。
node example.js
そして、生成された出力:
OutputFlag is not present.
引数を使用してスクリプトを実行する例を次に示します。
node example.js -f
そして、生成された出力:
OutputFlag is present.
条件付き制御構造の変更に限定する必要はありません。スクリプトに渡された実際の値を使用することもできます。
example.js
const custom = (process.argv[2] || 'Default'); console.log('Custom: ', custom);
このスクリプトは、引数に基づく条件の代わりに、渡された値(引数がない場合はデフォルトで"Default"
)を受け取り、それをスクリプト出力に挿入します。
値で複数の引数を使用する
引数を受け入れるスクリプトと生の値を受け入れるスクリプトを作成しましたが、引数と組み合わせて値を使用するシナリオではどうでしょうか。
物事をもう少し複雑にするために、複数の引数も受け入れましょう。
example.js
// Check to see if the -f argument is present const flag = ( process.argv.indexOf('-f') > -1 ? 'Flag is present.' : 'Flag is not present.' ); // Checks for --custom and if it has a value const customIndex = process.argv.indexOf('--custom'); let customValue; if (customIndex > -1) { // Retrieve the value after --custom customValue = process.argv[customIndex + 1]; } const custom = (customValue || 'Default'); console.log('Flag:', `${flag}`); console.log('Custom:', `${custom}`);
特定のインデックス値に依存する代わりにindexOf
を使用することにより、順序に関係なく、引数ベクトル内の任意の場所で引数を検索できます。
引数なしでスクリプトを実行する例を次に示します。
node example.js
そして、生成された出力:
OutputFlag: Flag is not present. Custom: Default
引数を使用してスクリプトを実行する例を次に示します。
node example.js -f --custom Override
そして、生成された出力:
OutputFlag: Flag is present. Custom: Override
これで、コマンドラインスクリプトは複数の引数と値を受け入れることができます。
commander
を使用する
前述の例は、引数の入力が非常に具体的である場合に機能します。 ただし、ユーザーは等号の有無にかかわらず引数(-nJaneDoe
または--name=JohnDoe
)、スペースを含む値を渡すための引用符付き文字列(-n "Jane Doe"
)、さらには引数を使用しようとする場合があります。短いバージョンと長いバージョンを提供するためにエイリアスされます。
そこで、commanderライブラリが役立ちます。
commander
は、同じ名前のRubyライブラリに触発された人気のあるNode.jsライブラリです。
まず、プロジェクトディレクトリで、プロジェクトを初期化します。
npm init
次に、commander
をインストールします。
npm install [email protected]
前の例を取り上げて、commander
を使用するように移植してみましょう。
example-commander.js
const commander = require('commander'); commander .version('1.0.0', '-v, --version') .usage('[OPTIONS]...') .option('-f, --flag', 'Detects if the flag is present.') .option('-c, --custom <value>', 'Overwriting value.', 'Default') .parse(process.argv); const options = commander.opts(); const flag = (options.flag ? 'Flag is present.' : 'Flag is not present.'); console.log('Flag:', `${flag}`); console.log('Custom:', `${options.custom}`);
commander
は、process.argv
を処理し、引数と関連する値をcommander
オブジェクトのプロパティとして追加することにより、すべてのハードワークを実行します。
スクリプトを簡単にバージョン管理し、-v
または--version
を使用してバージョン番号を報告できます。 また、--help
引数を渡すことでスクリプトの使用法を説明するわかりやすい出力が得られます。定義されていない、または渡された値が欠落している引数を渡すと、エラーがスローされます。
結論
この記事では、引数ベクトル、引数フラグの検出、複数の引数と値の処理、およびcommander
パッケージの使用について学習しました。
独自のコマンドライン引数を使用してスクリプトをすばやく作成できますが、より堅牢で保守性が必要な場合は、commander
またはInquirer.jsの利用を検討することをお勧めします。