pnpm run
エイリアス: run-script
パッケージのマニフェストファイルで定義されたスクリプトを実行します。
例
package.json
に次のように watch
というスクリプトが定義されているとしましょう。
"scripts": {
"watch": "webpack --watch"
}
pnpm run watch
を使ってこのスクリプトを実行することができます! シンプルですよね? キーをなるべく打ちたくない人のために、全てのスクリプトは pnpm コマンドのエイリアスとして設定されます。つまり、pnpm watch
はただの pnpm run watch
の省略です(スクリプトの名前が pnpm コマンドと被っていない限り)。
複数のスクリプトを実行する
スクリプト名の代わりに正規表現を使用すると、複数のスクリプトを同時に実行できます。
pnpm run "/<regex>/"
watch:
で始まるスクリプトを全て実行:
pnpm run "/^watch:.*/"
詳細
pnpm run
は scripts
を実行する際に、シェルの既存の PATH
に node_modules/.bin
を追加します。 つまり、パッケージがインストールされていれば、それをスクリプト内で通常のコマンドのように使えます。 例えば、 eslint
がインストールされている場合、次のようにスクリプトを書けます。
"lint": "eslint src --fix"
これは eslint
がシェルにグローバルにインストールされていなくても実行されます。
ワークスペースの場合は、<workspace root>/node_modules/.bin
も PATH
に追加されるため、ツールがワークスペースのルートにインストールされている場合、任意のワークスペースパッケージの scripts
から呼び出せます。
npm run
との違い
デフォルトでは、pnpm はユーザー定義スクリプトの任意の pre
および post
フックを実行しません (例えば prestart
など) 。 この npm の機能は、スクリプトが明示的ではなく暗黙的になり、実行フローを難解にする原因となっていました。 また、 pnpm serve
が pnpm preserve
も実行してしまうという驚くべき実行結果にもつながりました。
何らかの理由で npm の pre/post スクリプトの動作が必要な場合は、enable-pre-post-scripts
オプションを使用してください。
環境変数
実行されたスクリプトに対して、 pnpm が自動的に作成する環境変数があります。 これらの環境変数を使用して、実行中のプロセスに関するコンテキスト情報を取得できます。
pnpm によって作成される環境変数は次のとおりです。
- npm_command - 実行されたコマンドの名前が含まれています。 実行されたコマンドが
pnpm run
の場合、この変数の値は "run-script" になります。
Options
run
コマンドのオプションは、スクリプト名の前に記載する必要があります。 スクリプト名の後に記載されたオプションは、実行されるスクリプトに渡されます。
次の例では、いずれもpnpm CLIを --silent
オプション付きで実行します。
pnpm run --silent watch
pnpm --silent run watch
pnpm --silent watch
コマンド名の後の引数は、実行されるスクリプトに追加されます。 つまり、watch
が webpack --watch
を実行する場合、次のコマンドは:
pnpm run watch --no-color
このように実行されます:
webpack --watch --no-color
script-shell
- Default: null
- タイプ: path
pnpm run
コマンドで実行するスクリプトに使用するシェル。
例えば、WindowsでGit Bashを強制的に使用する場合は、次のようにします:
pnpm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"
shell-emulator
- デフォルト: false
- タイプ: Boolean
true
の場合、pnpm はスクリプトの実行に JavaScript の bash-like shell 実装を使用します。
このオプションは、クロスプラットフォームのスクリプト処理を簡単にします。 例えば、デフォルトでは、次のスクリプトはPOSIXに準拠していないシステムでは失敗します:
"scripts": {
"test": "NODE_ENV=test node test.js"
}
しかし、 shell-emulator
の設定を true
にすれば、すべてのプラットフォームで動作するようになります。
--recursive, -r
これは、各パッケージの "scripts" オブジェクトから任意のコマンドを実行します。 そのコマンドがないパッケージはスキップされます。 どのパッケージにもそのコマンドがない場合、コマンドは失敗します。
--if-present
if-present
フラグを使用すると、スクリプトが未定義のときに0以外の終了コードで終了するのを避けることができます。 これにより、未定義の可能性があるスクリプトを、実行チェーンを断ち切ることなく実行できます。
--parallel
並行性とトポロジカルソートの結果を完全に無視して、マッチする全てのパッケージに対して指定されたスクリプトを即時実行し、接頭辞付きのストリームで出力します。 このフラグは、多くのパッケージで長時間実行される処理、例えば、長時間のビルド処理に適しています。
--stream
子プロセスからの出力を、出力元パッケージのディレクトリを接頭辞にして、即座にストリーム出力します。 これにより、異なるパッケージからの出力を交互に出力できます。
--aggregate-output
並行して実行される子プロセスの出力を集約し、その子プロセスが終了したときにのみ出力を表示します。 これにより、 pnpm -r <command>
を --parallel
または --workspace-concurrency=<number>
と共に実行した後の大きなログを読むのが非常に簡単になります (特に CI の場合)。 --reporter=append-only
のみサポートします。
enable-pre-post-scripts
- デフォルト: false
- タイプ: Boolean
true
の場合、pnpm は任意の pre/post スクリプトを自動的に実行します。 つまり、pnpm foo
を実行すると、pnpm prefoo && pnpm foo && pnpm postfoo
を実行するのと同じことになります。
--resume-from <package_name>
特定のプロジェクトから実行を再開します。 このオプションは、大きなワークスペースを使用している場合に便利です。ビルド順序で前にあるすべてのプロジェクトを実行せずに、特定のプロジェクトからビルドを再開できます。
--report-summary
スクリプトの実行結果を pnpm-exec-summary.json
ファイルに記録します。
pnpm-exec-summary.json
ファイルの例:
{
"executionStatus": {
"/Users/zoltan/src/pnpm/pnpm/cli/command": {
"status": "passed",
"duration": 1861.143042
},
"/Users/zoltan/src/pnpm/pnpm/cli/common-cli-options-help": {
"status": "passed",
"duration": 1865.914958
}
}
status
の取りうる値は、'passed', 'queued', 'running' です。