You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:24:05