前言

最近升级了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 目录中吗?

我个人觉得是以下几点:

  1. 未来兼容性:从Prisma 7.0开始,output字段将成为必需字段。目前在Prisma 6.6.0中,不设置此字段会产生警告,但在Prisma 7中将不再支持默认行为 Generating Prisma Client
  2. 更好的可见性和控制:将Prisma Client生成到应用代码库中的自定义目录,可以让您完全掌控生成的代码,包括查询引擎 Prisma-client (Early Access)
  3. 避免隐藏行为:新的prisma-client生成器不再依赖"魔法"生成到node_modules中,而是让您明确指定生成位置,使构建过程更加透明 Prisma-client (Early Access)
  4. 多项目环境支持:在共享schema的多项目环境中,自定义输出路径允许您为不同项目生成客户端到各自的位置 Github Issue: Override output of Prisma Client
  5. 更好的模块兼容性:自定义输出路径可以帮助解决不同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即可。

此时我们再启动项目,无损使用新特性。

分类: Nest.js 标签: prismaNestjsoutput@prisma/client

评论

暂无评论数据

暂无评论数据

目录