npmスクリプト引数渡し解説
npmスクリプトにコマンドライン引数を渡す
npmスクリプトにコマンドライン引数を渡すことで、スクリプトの実行時に柔軟な動作が可能になります。これにより、さまざまなシナリオに対応し、スクリプトの再利用性を高めることができます。
方法
package.jsonファイルの
scripts
オブジェクトにスクリプトを定義します。{ "scripts": { "my-script": "node my-script.js" } }
スクリプト内で
process.argv
を使用してコマンドライン引数にアクセスします。// my-script.js const args = process.argv.slice(2); // スクリプト名を除く引数を取得 console.log(args);
例
npm run my-script -- arg1 arg2
この場合、my-script.js
のargs
変数には、["arg1", "arg2"]
が格納されます。
活用例
- オプションの指定
npm run my-script -- --verbose --help
- ファイルの指定
npm run my-script -- input.txt output.txt
- 環境変数の設定
npm run my-script -- --env=production
注意点
process.env
を使用して環境変数にもアクセスできます。--
をコマンドライン引数に渡すことで、スクリプト名と実際の引数を区別できます。process.argv
は、スクリプト名と引数の配列です。
{
"scripts": {
"greet": "node greet.js"
}
}
greet.js
const args = process.argv.slice(2);
const name = args[0] || 'World';
console.log(`Hello, ${name}!`);
実行
npm run greet -- John
出力
Hello, John!
解説
- package.json
scripts
オブジェクトにgreet
という名前のスクリプトを定義し、node greet.js
を実行するように設定しています。 - greet.js
process.argv
: コマンドライン引数の配列を取得します。slice(2)
: スクリプト名とノード実行ファイルのパスを除外して、実際の引数部分だけを取得します。args[0]
: 渡された最初の引数をname
変数に格納します。もし引数がなければ、World
というデフォルト値が使用されます。console.log
:Hello, ${name}!
というメッセージを出力します。
- 実行
npm run greet -- John
というコマンドでスクリプトを実行し、John
という名前を渡しています。
他の例: ファイル操作
{
"scripts": {
"copy": "node copy.js"
}
}
copy.js
const fs = require('fs');
const source = process.argv[2];
const destination = process.argv[3];
fs.copyFile(source, destination, (err) => {
if (err) throw err;
console.log('File copied successfully!');
});
npm run copy -- input.txt output.txt
この例では、ファイルのコピーを行うスクリプトです。process.argv
からソースファイルとデスティネーションファイルのパスを取得し、fs.copyFile
を使ってファイルをコピーしています。
- ファイル操作だけでなく、様々な処理をコマンドライン引数によって制御することができます。
- コマンドライン引数は、スクリプトの実行時に柔軟な制御を行うために非常に便利です。
slice(2)
を使うことで、スクリプト名とノード実行ファイルのパスを除外できます。process.argv
は、Node.jsでコマンドライン引数にアクセスするための組み込みのオブジェクトです。
さらに詳しく
- 環境変数の利用
process.env
を使って、環境変数に設定された値を取得することもできます。 - オプションの処理
yargs
などのライブラリを使うと、より複雑なコマンドラインオプションの処理が可能になります。 - 複数の引数の処理
args
配列の要素を順番にアクセスすることで、複数の引数を処理できます。
process.argv
のインデックスは0から始まることに注意してください。--
(ダッシュ2つ)を使うことで、npmスクリプトに渡す引数と、npmコマンド自身に渡すオプションを区別できます。
- npmスクリプトは、タスクランナーとして活用することもできます。
- npmスクリプトでは、シェルスクリプトのようにパイプやリダイレクトも利用できます。
npmスクリプトへのコマンドライン引数渡し:代替方法と詳細解説
これまで、process.argv
を用いてnpmスクリプトにコマンドライン引数を渡す方法について解説してきました。しかし、より複雑な引数処理や、より洗練されたユーザーインターフェースを実現したいケースもあるでしょう。そこで、本記事では、process.argv
以外の代替方法や、npmスクリプトの引数処理をより深く掘り下げていきます。
引数解析ライブラリの利用
commander.js
ミリタリーコマンドラインインターフェースにインスパイアされたライブラリです。- 直感的なAPI:シンプルで覚えやすいAPIで、コマンドラインインターフェースを構築できます。
- オプション: サブコマンド、フラグ、引数などを簡単に定義できます。
- 例:
const { program } = require('commander'); program .version('1.0.0') .option('-n, --name <name>', 'Your name') .parse(process.argv); console.log(`Hello, ${program.opts().name}!`);
yargs
Node.jsで最も人気のある引数解析ライブラリの一つです。- 豊富な機能:位置引数、オプション、ヘルプメッセージ、バリデーションなど、様々な機能を提供します。
- 使いやすさ:直感的なAPIで、複雑な引数処理を簡単に実装できます。
const yargs = require('yargs'); const argv = yargs .option('name', { alias: 'n', describe: 'Your name', type: 'string', demandOption: true }) .argv; console.log(`Hello, ${argv.name}!`);
npm configの利用
npm_config_*変数
npmの設定値を環境変数として取得できます。package.json
のscripts
オブジェクト内で、$npm_config_*
という形式で変数展開できます。
{ "scripts": { "greet": "node greet.js" } }
npm run greet -- --name=John
// greet.js const name = process.env.npm_config_name; console.log(`Hello, ${name}!`);
シェルスクリプトの活用
複雑な処理
シェルスクリプトの機能を組み合わせて、より高度な引数処理を実現できます。{ "scripts": { "build": "sh build.sh" } }
# build.sh #!/bin/bash ENV=$1 npm run build -- --env=$ENV
- npm-run-all
複数のスクリプトを並列または直列で実行する際に便利です。 - カスタムパーサーの作成
process.argv
を直接解析して、独自の引数処理ロジックを実装することも可能です。
選択のポイント
- 可読性
コードの可読性を高めるために、適切なライブラリや手法を選択しましょう。 - チームの慣習
チーム内で特定のライブラリが利用されている場合は、それに合わせることも重要です。 - 複雑さ
シンプルな引数処理ならprocess.argv
で十分ですが、複雑なオプションやバリデーションが必要な場合は、yargsやcommander.jsなどのライブラリがおすすめです。
npmスクリプトにコマンドライン引数を渡す方法は、process.argv
以外にも様々な選択肢があります。それぞれの方法にはメリット・デメリットがあるため、プロジェクトの規模や複雑さ、チームの慣習に合わせて最適な方法を選択することが重要です。
方法 | メリット | デメリット |
---|---|---|
process.argv | シンプル、軽量 | 複雑な引数処理には不向き |
yargs, commander.js | 豊富な機能、使いやすさ | 学習コスト |
npm config | npmと連携しやすい | 柔軟性に欠ける |
シェルスクリプト | 柔軟性が高い | 学習コスト、プラットフォーム依存性 |
カスタムパーサー | 完全な自由度 | 開発工数 |
javascript node.js npm