開発完了
pnpm monorepoでwranglerがMODULE_NOT_FOUNDになる問題
pnpm workspaceで管理しているmonorepoで、突然wranglerが見つからなくなるエラーの原因と解決策を解説する。
結論
monorepoのルートからpnpm installを実行すれば直る。
cd /path/to/monorepo-root
pnpm install
症状
Workerディレクトリでwrangler deployを実行すると以下のエラーが発生:
Error: Cannot find module '.../node_modules/wrangler/bin/wrangler.js'
at Function._resolveFilename (node:internal/modules/cjs/loader:1401:15)
...
code: 'MODULE_NOT_FOUND',
npx wrangler deployでも同じエラー。
原因
pnpmのシンボリックリンクが壊れた。
pnpmはnode_modules内でシンボリックリンクを多用してディスク容量を節約している。Windowsでは特に、このシンボリックリンクが壊れることがある。
確認すると、node_modules/wranglerディレクトリは存在するように見えるが、実際にはリンク先が見つからない状態になっている:
$ ls "node_modules/"
@cloudflare
typescript
workers-og
wrangler # ← 存在するように見える
$ ls "node_modules/wrangler/"
ls: cannot access 'node_modules/wrangler/': No such file or directory # ← 実際はない
解決策
monorepoのルートからpnpm installを実行する:
cd /path/to/monorepo-root
pnpm install
個別パッケージディレクトリ(例:apps/workers/og)からではなく、必ずルートから実行すること。
pnpm workspaceでは、ルートから実行することで全パッケージの依存関係を正しく解決し、シンボリックリンクを再作成する。
なぜルートからなのか
pnpm workspaceの構造:
monorepo-root/
├── package.json # ワークスペース定義
├── pnpm-workspace.yaml
├── node_modules/ # 共有依存関係
├── apps/
│ └── workers/
│ └── og/
│ ├── package.json
│ └── node_modules/ # シンボリックリンク
└── packages/
個別ディレクトリのnode_modulesはルートへのシンボリックリンク。ルートからpnpm installすることで、このリンク構造全体が再構築される。
再発防止
特に防ぐ方法はない。pnpmのシンボリックリンクは時々壊れる(特にWindowsで)。
覚えておくこと: MODULE_NOT_FOUNDエラーが出たら、まずpnpm install(ルートから)を試す。