序章

コマンドライン引数は、コマンドに追加の入力を提供する方法です。 コマンドライン引数を使用して、Node.jsスクリプトに柔軟性とカスタマイズを追加できます。

この記事では、引数ベクトル、引数フラグの検出、複数の引数と値の処理、およびcommanderパッケージの使用について学習します。

前提条件

このチュートリアルを実行するには、次のものが必要です。

このチュートリアルは、ノードv16.10.0、npm v7.12.2、およびcommanderv7.2.0で検証されました。

引数ベクトルの使用

Node.jsは、引数vectorと呼ばれる渡された引数のリストをサポートします。 引数ベクトルは、Node.jsスクリプトのprocess.argvから利用できる配列です。

配列には、Node.js実行可能ファイル、スクリプトのパスとファイル名など、スクリプトに渡されるすべてのものが含まれています。

次のコマンドを実行する場合:

  1. 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);
}

このサンプルコードは、argvlengthをチェックします。 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と等しい場合、出力が変更されます。

引数なしでスクリプトを実行する例を次に示します。

  1. node example.js

そして、生成された出力:

Output
Flag is not present.

引数を使用してスクリプトを実行する例を次に示します。

  1. node example.js -f

そして、生成された出力:

Output
Flag 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

そして、生成された出力:

Output
Flag: Flag is not present. Custom: Default

引数を使用してスクリプトを実行する例を次に示します。

  1. node example.js -f --custom Override

そして、生成された出力:

Output
Flag: Flag is present. Custom: Override

これで、コマンドラインスクリプトは複数の引数と値を受け入れることができます。

commanderを使用する

前述の例は、引数の入力が非常に具体的である場合に機能します。 ただし、ユーザーは等号の有無にかかわらず引数(-nJaneDoeまたは--name=JohnDoe)、スペースを含む値を渡すための引用符で囲まれた文字列(-n "Jane Doe")、さらには引数を使用しようとする場合があります。短いバージョンと長いバージョンを提供するためにエイリアスされます。

そこで、commanderライブラリが役立ちます。

commanderは、同じ名前のRubyライブラリに触発された人気のあるNode.jsライブラリです。

まず、プロジェクトディレクトリで、プロジェクトを初期化します。

  1. npm init

次に、commanderをインストールします。

  1. npm install commander@7.2.0

前の例を取り上げて、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の利用を検討することをお勧めします。