如何将Prisma Client与SvelteKit构建产物打包 免除服务器额外安装
解决方案
1. 自定义Prisma Client生成路径
默认Prisma Client会生成到node_modules/.prisma/client目录,不会被SvelteKit打包进最终产物,因此需要修改生成路径到项目源码目录内。
修改你的src/lib/backend/prisma/schema.prisma配置:
generator client { provider = "prisma-client-js" // 自定义生成路径到项目源码目录 output = "./generated/client" // 补充生产服务器对应的二进制目标,和CI环境的架构同时保留 binaryTargets = ["native", "linux-musl-openssl-3.0.x"] // 示例为Alpine系统的目标,可根据服务器实际架构调整 // 其他原有配置保持不变 }
后续项目中导入Prisma Client时,从自定义路径导入即可,不要使用默认的@prisma/client导入:
import { PrismaClient } from '$lib/backend/prisma/generated/client'
2. 配置SvelteKit打包规则
修改svelte.config.js,让打包工具把Prisma Client代码和依赖的查询引擎二进制文件都包含进构建产物:
import adapter from '@sveltejs/adapter-node'; import { vitePreprocess } from '@sveltejs/kit/vite'; /** @type {import('@sveltejs/kit').Config} */ const config = { preprocess: vitePreprocess(), kit: { adapter: adapter({ // 配置额外需要复制到构建产物的文件 files: { extra: [ 'src/lib/backend/prisma/generated/client/libquery_engine-*.node', 'src/lib/backend/prisma/schema.prisma' ] } }), vite: { ssr: { // 禁止将Prisma Client标记为外部依赖,让Vite将其打包进最终产物 noExternal: [/.*prisma\/generated\/client.*/] } } } }; export default config;
3. 调整构建脚本
修改package.json的scripts配置,把Prisma生成步骤和构建步骤绑定,避免遗漏:
{ "scripts": { "postinstall": "prisma generate --schema src/lib/backend/prisma/schema.prisma", "build": "prisma generate --schema src/lib/backend/prisma/schema.prisma && vite build" } }
4. 优化CI流程
现在所有构建动作都可以在CI环境完成,不需要在生产服务器执行依赖安装、Prisma生成、项目构建操作,优化后的gitlab-ci.yaml如下:
deploy: image: node:20-alpine before_script: - apk update && apk add openssh-client rsync script: # CI环境内完成依赖安装、Prisma生成、项目构建 - npm ci - npm run build # SSH配置部分保持不变 - mkdir -p ~/.ssh - eval "$(ssh-agent -s)" - echo "$PRIVATE_KEY" | ssh-add - - ssh-keyscan -H $WEB_SERVER_IP >> ~/.ssh/known_hosts # 仅传输构建产物到服务器,不需要传输整个项目源码 - rsync -chavzP --stats build/ "root@$WEB_SERVER_IP:~/dsp-app/build" # 服务器端仅需要重启PM2即可 - ssh root@$WEB_SERVER_IP "cd $FOLDER; pm2 delete index 2> /dev/null || true" - ssh root@$WEB_SERVER_IP "cd $FOLDER; pm2 startup" - ssh root@$WEB_SERVER_IP "cd $FOLDER; pm2 start -f build/index.js --watch" - ssh root@$WEB_SERVER_IP "cd $FOLDER; pm2 save"
注意:如果CI构建环境和生产服务器的操作系统/架构不同,一定要在binaryTargets中添加服务器对应的目标架构,否则会出现查询引擎缺失的错误。
内容的提问来源于stack exchange,提问作者Willem Vanhulle
相关产品推荐
相关产品推荐

