• #pnpm
  • #wrangler
  • #cloudflare
  • #monorepo
  • #windows
開発完了

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(ルートから)を試す。