メインコンテンツまでスキップ
Version: Next

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 runscripts を実行する際に、シェルの既存の PATHnode_modules/.bin を追加します。 つまり、パッケージがインストールされていれば、それをスクリプト内で通常のコマンドのように使えます。 例えば、 eslint がインストールされている場合、次のようにスクリプトを書けます。

"lint": "eslint src --fix"

これは eslint がシェルにグローバルにインストールされていなくても実行されます。

ワークスペースの場合は、<workspace root>/node_modules/.binPATH に追加されるため、ツールがワークスペースのルートにインストールされている場合、任意のワークスペースパッケージの scripts から呼び出せます。

npm run との違い

デフォルトでは、pnpm はユーザー定義スクリプトの任意の pre および post フックを実行しません (例えば prestart など) 。 この npm の機能は、スクリプトが明示的ではなく暗黙的になり、実行フローを難解にする原因となっていました。 また、 pnpm servepnpm 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

コマンド名の後の引数は、実行されるスクリプトに追加されます。 つまり、watchwebpack --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.

--filter <package_selector>

詳細についてはフィルタリングに関するドキュメントを参照してください。