Skip to content

pnpmでのnpx相当コマンド

問題の説明

Node.jsプロジェクトで一般的に使用されるnpxコマンドを、pnpm環境で実行しようとすると正常に動作しない場合があります。特に:

  • npxがローカルのnode_modules内のバイナリを認識しない
  • pnpxコマンドはリモートパッケージの取得に動作し、npm createと似た挙動を示す
  • ローカルバイナリ実行と一時ダウンロード実行の区別が不透明

この根本原因は、pnpmnpxと完全互換ではない仕様を持っているためです。正しい代替コマンドを理解する必要があります。

推奨ソリューション

npxには主に2つの用途があり、それぞれpnpmで異なるコマンドを使用します。

主要な2つのユースケース

  1. ローカルバイナリの実行
  2. パッケージの一時ダウンロード&実行

ケース1: ローカルバイナリの実行

インストール済みパッケージのバイナリを実行する場合(例:jesteslint

bash
# npxによる実行例
npx jest

# pnpmでは"pnpm exec"を使用
pnpm exec jest

pnpm execnode_modules/.binディレクトリ内のバイナリを探索し、プロジェクトローカルの依存関係を優先して実行します。

ユースケース例

bash
# ローカルにインストールされたTypeScriptコンパイラの実行
pnpm exec tsc --version

# 開発依存パッケージのバイナリ実行
pnpm exec prettier --write src/

ケース2: 一時的なパッケージのダウンロード&実行

未インストールパッケージの一時ダウンロードとコマンド実行(例:create-react-app

bash
# npxによる実行例
npx create-react-app my-app

# pnpmでは"pnpm dlx"を使用
pnpm dlx create-react-app my-app

pnpm dlxは次の動作を行います:

  1. 指定パッケージを一時ディレクトリにダウンロード(グローバルインストール不要)
  2. パッケージのバイナリを即時実行
  3. 実行後、一時ファイルをクリーンアップ

ユースケース例

bash
# Next.jsプロジェクトの作成
pnpm dlx create-next-app@latest my-next-project

# ツールの単発利用例 (例: HTTPサーバー起動)
pnpm dlx http-server ./dist -p 8080

過去のコマンド"pnpx"について

pnpxコマンドは廃止されました。古い資料で見つけても使用しないでください。現在の正式な代替コマンドは:

  • pnpm exec (ローカルバイナリ用)
  • pnpm dlx (パッケージ一時実行用)

技術的解説

pnpm execの動作原理

  1. node_modules/.binディレクトリを探索
  2. PATH環境変数をローカル環境向けに自動設定
  3. プロジェクトスコープ内の正確な依存バージョンを確保
  4. グローバル環境を汚染せず実行
javascript
// node_modules内のバイナリ探索
const binPath = resolve('./node_modules/.bin/jest');
child_process.execSync(binPath);

pnpm dlxの動作原理

  1. 専用のキャッシュディレクトリにパッケージをダウンロード
  2. 依存関係を分離して解決(グローバルインストールなし)
  3. pre/postスクリプトを含む完全なパッケージ実行
  4. 処理完了後、一時領域を自動削除

互換性に関する注意

現在のnpm環境ではnpxの代わりにnpm execの使用が推奨されています。しかしpnpmを使用している場合、直接pnpm exec/pnpm dlxを利用するのが最適です。

推奨ワークフローまとめ

操作内容npx時代のコマンドpnpm推奨コマンド
ローカルインストール済みツール実行npx <command>pnpm exec <command>
ツールの一時利用npx <package>pnpm dlx <package>
バージョン指定実行npx package@1.0.0pnpm dlx package@1.0.0

実際の開発シーンで頻出する例:

bash
# ローカルESLintの実行 (インストール済み)
pnpm exec eslint ./src

# Vueプロジェクトの新規作成(一時ダウンロード)
pnpm dlx create-vue@latest

# 特定バージョンのcreate-react-app使用
pnpm dlx create-react-app@5.1.0 my-app

最新のpnpm(v8以上)では、pnpm execpnpm dlxnpxの完全代替として安定動作します。公式ドキュメントにもこの挙動が明記されているため、プロジェクト内で一貫したコマンド体系を使用可能です。