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' です。