将 Prisma 与 Yarn v3 结合使用

Using Prisma with Yarn v3

我正在使用 Next.js、Next-Auth 和 Prisma 构建应用程序。我正在为后端代码使用 API 路由。最近,我将电脑上的 Yarn 升级到 v3.1.1。然后我创建了一个 .yarnrc.yml 文件并将 nodeLinker 选项设置为 "node-modules" 以避免将此项目转换为 PnP。
当我 运行 开发服务器在我的应用程序上工作时,我 运行 进入这个错误,因为它试图编译 next-auth API 路由。更奇怪的是,通过 Vercel 部署时不会出现此问题;功能日志很好,按预期工作。

Error: ENOENT: no such file or directory, open 'C:\Users\htech\Desktop\code\consulting\.yarn\unplugged\@prisma-client-virtual-d7adb716b6\node_modules\.prisma\client\schema.prisma'

当我搜索类似问题时,出现的通常解决方案是在 schema.prisma 中设置自定义输出路径。 当我添加自定义输出路径并相应地更新导入时,它只会吐出一些深奥的内部依赖性错误。

error - ./prisma/generated/runtime/index.js:27652:17
Module not found: Can't resolve '_http_common'
  27650 |   "../../node_modules/.pnpm/undici@3.3.6/node_modules/undici/lib/node/http-parser.js"(exports2, module2) {
  27651 |     "use strict";
> 27652 |     var common = require("_http_common");

环境


这似乎是一个关于生成目标的简单问题。但是,除了回滚系统范围的 yarn 版本之外,我不知道如何解决这个问题。我 运行 有问题吗?有人有解决办法吗?

在测试了许多不同的东西之后,我相信我找到了解决方案。

问题

问题在于 Yarn 如何解析导入。 Prisma CLI 将客户端(默认情况下)生成为 node_modules/.prisma。即使 nodeLinker 设置为 node-modules,Yarn 也会尝试将此导入解析为 .yarn/unplugged/<folder-name>,其中生成的客户端不存在。

解决方案

为了解决这个分辨率问题,我们必须为 .prisma 文件夹创建自定义分辨率。这假定您没有自定义输出路径。

# .yarnrc.yml

nodeLinker: node-modules

packageExtensions:
  "@prisma/client@*":
    dependencies:
      ".prisma": 'link:See "resolution" field of package.json'
# package.json

{
  ...
  "resolutions": {
     ".prisma": "link:node-modules/.prisma"
  }
}

Credit to this user on Github