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' です。
--reporter-hide-prefix
Hide workspace prefix from output from child processes that are run in parallel, and only print the raw output. This can be useful if you are running on CI and the output must be in a specific format without any prefixes (e.g. GitHub Actions annotations). Only --reporter=append-only
is supported.