
pnpm v10環境でPrisma Clientが見つからない場合の対処法 (Error: Cannot find module '.prisma/client/default')
pnpmとprismaを使用したアプリケーション開発において、表題のようなエラー(Error: Cannot find module '.prisma/client/default’)に遭遇しました。本ブログではその対処方法を紹介したいと思います。
困っていたこと
pnpmとPrismaを採用したNestJSアプリケーションを開発し、ECS(Amazon Elastic Container Service)上での動作を目指していました。その過程で、アプリケーション起動時に以下のエラーメッセージに直面しました。
Error: Cannot find module ‘.prisma/client/default’
筆者の環境
- NestJS v10.3.10
- pnpm v10.10.0
- prisma v5.16.1
原因
この問題の主な原因は、pnpm v10から依存関係(dependencies)のlifecycle script(postinstallなど)がデフォルトで実行されなくなったことです。
pnpm.onlyBuiltDependencies
Only packages listed in this array will be able to run install scripts. IfonlyBuiltDependenciesFile
andneverBuiltDependencies
are not set, this configuration option will default to blocking all install scripts.pnpm
解決策
@prisma/clientのlifecycle scriptを許可します。具体的には、packages.json内のpnpmフィールドに"onlyBuiltDependencies”を宣言します。
{
"name": "~~~~~~~~~"
~~~省略〜〜〜
},
"pnpm": {
"onlyBuiltDependencies": ["@prisma/client"]
}
}
確認のため、上記の設定でpnpm installを実行した際に、許可したlifecycle scriptが実行されるか検証します。
// onlyBuiltDependencies設定無し
[build 8/17] RUN pnpm install --frozen-lockfile --filter server
~~~省略~~~
#12 16.00 Progress: resolved 819, reused 0, downloaded 735, added 735
#12 17.00 Progress: resolved 819, reused 0, downloaded 816, added 816
#12 17.88 Progress: resolved 819, reused 0, downloaded 819, added 819, done
#12 18.21 Done in 14.4s using pnpm v10.10.0
#12 DONE 18.3s
//onlyBuiltDependencies設定有り
#12 [build 8/17] RUN pnpm install --frozen-lockfile --filter server
~~~省略~~~
#12 15.45 Progress: resolved 819, reused 0, downloaded 795, added 795
#12 15.97 Progress: resolved 819, reused 0, downloaded 819, added 819, done
#12 16.19 .../node_modules/@prisma/client postinstall$ node scripts/postinstall.js
#12 19.88 .../node_modules/@prisma/client postinstall: Done
#12 20.03 Done in 16.8s using pnpm v10.10.0
#12 DONE 20.1s
無事pnpm install後にpostinstallが実行されていることが確認できました!
結論
pnpm v10以降、dependenciesのlifecycle scriptがデフォルトで実行されなくなりました。Prismaのようにpostinstallスクリプトを使用するライブラリを使用する場合は、package.json内で"pnpm": { "onlyBuiltDependencies": ["<パッケージ名>"] }
のように宣言し、必要なlifecycle scriptの実行を明示的に許可する必要があります。
参考
エラー解消にあたりこちらのissueを参考にしました。自身の環境に合わせて参考にしてください。
この記事が、同じ問題に直面している方々の助けになれば幸いです!