開発者ドキュメント

Node.jsスクリプトでコマンドライン引数を処理する方法

序章

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

この記事では、引数ベクトル、引数フラグの検出、複数の引数と値の処理、および commander パッケージ。

前提条件

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

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

引数ベクトルの使用

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

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

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

  1. node example.js -a -b -c

引数ベクトルには、次の5つの項目が含まれます。

[
  '/usr/bin/node',
  '/path/to/example.js',
  '-a',
  '-b',
  '-c'
]

少なくとも、引数なしで実行されるスクリプトには、配列に2つの項目が含まれます。 node 実行可能ファイルと実行中のスクリプトファイル。

通常、引数ベクトルは引数カウントargc)渡された引数の数を示します。 Node.jsにはこの特定の変数がありませんが、いつでも取得できます length 引数ベクトル配列の:

example.js
if (process.argv.length === 2) {
  console.error('Expected at least one argument!');
  process.exit(1);
}

このサンプルコードは、 lengthargv. の長さ 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番目の項目があるかどうかをチェックします。 インデックスは 2 JavaScriptの配列はゼロインデックスであるためです。 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

モバイルバージョンを終了