pnpm run
エイリアス: run-script
パッケージのマニフェストファイルで定義されたスクリプトを実行します。
例
package.json
に次のように watch
というスクリプトが定義されているとしましょう。
"scripts": {
"watch": "build-command --watch"
}
pnpm run watch
を使ってこのスクリプトを実行することができます! シンプルですよね? キーをなるべく打ちたくない人のために、全てのスクリプトは pnpm コマンドのエイリアスとして設定されます。つまり、pnpm watch
はただの pnpm run watch
の省略です(スクリプトの名前が pnpm コマンドと被っていない限り)。
詳細情報
シェルの既存の PATH
に加え、pnpm run
は scripts
に対し、 node_modules/.bin
を PATH
に追加します。 これは、パッケージをインストールすれば、それをスクリプト内で通常のコマンドのように使えることを意味します。 例えば、 eslint
がインストールされている場合:
"lint": "eslint src --fix"
また、 eslint
がシェルにグローバルにインストールされていなくても、実行されます。
ワークスペースの場合、v3.5以降、<workspace root>/node_modules/.bin
も PATH
に追加されるため、ツールがワークスペースルートにインストールされている場合、任意のワークスペースパッケージの scripts
から呼び出すことができます。
npm run
との違い
デフォルトでは、pnpm はユーザー定義スクリプト (prestart
など) の任意の pre
および post
フックを実行しません。 npmから受け継いだこの動作は、スクリプトが明示的ではなく暗黙的になり、実行フローを難解にする原因となっていました。 また、 pnpm serve
が pnpm preserve
も実行してしまうという驚くべき実行結果にもつながりました。
何らかの理由で npm の pre/post スクリプトの動作が必要な場合は、enable-pre-post-scripts
オプションを使用します。
Options
script-shell
追加されたバージョン:v5.10.0
- デフォルト: null
- タイプ: path
pnpm run
コマンドで実行するスクリプトに使用するシェルです。
例えば、WindowsでGit Bashを強制的に使用する場合:
pnpm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"
shell-emulator
追加されたバージョン:v5.8.0
- デフォルト: 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
追加されたバージョン:v4.5.0
if-present
フラグを使用すると、スクリプトが未定義のときに0以外の終了コードで終了するのを避けることができます。 これにより、未定義の可能性があるスクリプトを、実行の過程を断ち切ることなく実行できます。
--parallel
追加されたバージョン:v5.1.0
並行性とトポロジカルソートの結果を完全に無視して、マッチする全てのパッケージに対して指定されたスクリプトを即時実行し、接頭辞付きのストリームで出力します。 このフラグは、多くのパッケージで長時間実行される処理、例えば、長時間のビルド処理に適しています。
--stream
追加されたバージョン:v5.1.0
子プロセスからの出力を、元のパッケージのディレクトリを先頭に、即座にストリーム出力します。 これにより、異なるパッケージからの出力をインターリーブすることができます。
--aggregate-output
追加されたバージョン:v6.24.0
並行して実行される子プロセスの出力を集約し、子プロセスが終了したときのみ出力を表示します。 pnpm -r <command>
を --parallel
または --workspace-concurrency=<number>
と共に実行した後の大きなログを読むのが非常に簡単になります (特に CI の場合)。 --reporter=append-only
のみサポートします。
enable-pre-post-scripts
追加されたバージョン:v6.1.0
- デフォルト: false
- タイプ: Boolean
true
の場合、pnpm は任意の pre/post スクリプトを自動的に実行します。 つまり、pnpm foo
を実行すると、pnpm prefoo && pnpm foo && pnpm postfoo
を実行するのと同じことになります。