Nestjs与Prisma 7.0.0版本更新导致的客户端生成问题
前言
最近升级了Prisma依赖后,它会在生成客户端时打印这么一句话:
Warning: You did not specify an output path for your `generator` in schema.prisma. This behavior is deprecated and will no longer be supported in Prisma 7.0.0.✔ Generated Prisma Client (v6.6.0) to .\node_modules\.pnpm\@prisma+client@6.6.0_prisma_66ad65b8aa48c66bbd9b3e64cfcf114a\node_modules\@prisma\client in 52ms
意思是在Prisma未来7.0的版本以后,必须在 schema.prisma
文件的 generator
中声明 output
属性,用于声明Prisma客户端的生成位置。
为什么要声明?Prisma默认不是生成在 node_modules 目录中吗?
我个人觉得是以下几点:
- 未来兼容性:从Prisma 7.0开始,
output
字段将成为必需字段。目前在Prisma 6.6.0中,不设置此字段会产生警告,但在Prisma 7中将不再支持默认行为 Generating Prisma Client。 - 更好的可见性和控制:将Prisma Client生成到应用代码库中的自定义目录,可以让您完全掌控生成的代码,包括查询引擎 Prisma-client (Early Access)。
- 避免隐藏行为:新的
prisma-client
生成器不再依赖"魔法"生成到node_modules
中,而是让您明确指定生成位置,使构建过程更加透明 Prisma-client (Early Access)。 - 多项目环境支持:在共享schema的多项目环境中,自定义输出路径允许您为不同项目生成客户端到各自的位置 Github Issue: Override
output
of Prisma Client。 - 更好的模块兼容性:自定义输出路径可以帮助解决不同JavaScript环境(如ESM、Bun、Deno等)中的模块解析问题 Prisma-client (Early Access)。
为此我也将项目中的prisma进行了调整。
如果你配置失败,大概率会报以下错误:
[16:14:14] Found 0 errors. Watching for file changes.
node:internal/modules/cjs/loader:1228
throw err;
^
Error: Cannot find module '.prisma/client/default'
Require stack:
- G:\code\test\nest-demo\node_modules\.pnpm\@prisma+client@6.6.0_prisma_66ad65b8aa48c66bbd9b3e64cfcf114a\node_modules\@prisma\client\default.js
- G:\code\test\nest-demo\dist\src\common\filters\http-exception\http-exception.filter.js
- G:\code\test\nest-demo\dist\src\common\filters\index.js
- G:\code\test\nest-demo\dist\src\shared\shared.module.js
- G:\code\test\nest-demo\dist\src\app.module.js
- G:\code\test\nest-demo\dist\src\main.js
at Function._resolveFilename (node:internal/modules/cjs/loader:1225:15)
at Function._load (node:internal/modules/cjs/loader:1055:27)
at TracingChannel.traceSync (node:diagnostics_channel:322:14)
at wrapModuleLoad (node:internal/modules/cjs/loader:220:24)
at Module.require (node:internal/modules/cjs/loader:1311:12)
at require (node:internal/modules/helpers:136:16)
at Object.<anonymous> (G:\code\test\nest-demo\node_modules\.pnpm\@prisma+client@6.6.0_prisma_66ad65b8aa48c66bbd9b3e64cfcf114a\node_modules\@prisma\client\default.js:2:6)
at Module._compile (node:internal/modules/cjs/loader:1554:14)
at Object..js (node:internal/modules/cjs/loader:1706:10)
at Module.load (node:internal/modules/cjs/loader:1289:32) {
code: 'MODULE_NOT_FOUND',
requireStack: [
'G:\\code\\test\\nest-demo\\node_modules\\.pnpm\\@prisma+client@6.6.0_prisma_66ad65b8aa48c66bbd9b3e64cfcf114a\\node_modules\\@prisma\\client\\default.js', 'G:\\code\\test\\nest-demo\\dist\\src\\common\\filters\\http-exception\\http-exception.filter.js',
'G:\\code\\test\\nest-demo\\dist\\src\\common\\filters\\index.js',
'G:\\code\\test\\nest-demo\\dist\\src\\shared\\shared.module.js',
'G:\\code\\test\\nest-demo\\dist\\src\\app.module.js',
'G:\\code\\test\\nest-demo\\dist\\src\\main.js'
]
}
以下是我的正确操作。
教程
配置 schema.prisma
generator client {
provider = "prisma-client-js"
output = "./generated/client"
}
我个人更倾向于配置到该文件的同级目录,因为这个文件本身不参与代码构建,所以我是不太喜欢放在src目录下的。
生成客户端
我们可以运行 prisma:generate
或者其他命令实现,这里就不多赘述。
配置路径别名
配置路径别名的好处就是不要用相对或者绝对路径,到时候如果路径发生变化,其实也不用改所有的文件引入,只改动一两个配置文件即可。
在 tsconfig.json
中如下配置:
{
"compilerOptions": {
"paths": {
"@prisma-client": ["./prisma/generated/client"],
}
}
}
配置nestjs打包
由于客户端现在不在node_modules中,所以我们还需要将这个客户端移动到dist目录中,这样文件才能正确获取到。
打开 nest-cli.json
文件,添加如下配置
{
"compilerOptions": {
"deleteOutDir": true,
"watchAssets": true,
"assets": [
{
"include": "../prisma/generated",
"outDir": "dist/prisma",
"watchAssets": true
}
],
}
}
注意:../
这个路径没错奥,不是你想的基于当前文件的相对路径。
修改代码的引入
我们将代码中所有的引入替换成路径别名:
将:
import { PrismaClient } from "@prisma/client";
替换成:
import { PrismaClient } from "@prisma-client";
也就是@prisma/client
换成@prisma-client
即可。
此时我们再启动项目,无损使用新特性。
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据