为何Prisma ORM Client在Windows可构建,Mac生产构建失败?
Electron + Prisma Mac生产构建故障排查方案
问题背景
我们有一个基于本地SQLite数据库、使用Prisma的Electron桌面应用。Windows分发构建运行正常,但Mac生产构建无法工作,开发环境下Mac应用完全正常。客户端报错集中在响应对象缺失字段,推测是Prisma服务端调用未返回数据或出错,但生产构建无法查看服务端日志。已尝试修改package.json和Prisma schema配置,现附上相关配置。
现有配置
Prisma Schema配置(数据库Schema已省略,开发环境验证可用)
generator client { provider = "prisma-client-js" output = "../node_modules/.prisma/client" previewFeatures = ["napi"] binaryTargets = ["native", "windows", "darwin", "darwin-arm64"] } datasource db { provider = "sqlite" url = "file:nimbleStore2.db" }
package.json构建配置
"build": { "productName": "NimbleAB", "appId": "com.Nimble|electron.NimbleAB", "directories": { "buildResources": "resources" }, "asar": true, "asarUnpack": "**/query-engine-windows.exe", "files": [ "app/dist/**/*", "app/electron/**/*" ], "win": { "target": [ { "target": "nsis", "arch": [ "x64" ] } ] }, "linux": { "target": [ "deb", "rpm", "snap", "AppImage" ] }, "extraResources": [ "prisma/nimblestore2.db", "node_modules/.prisma/**/*", "node_modules/@prisma/client/**/*" ] },
针对性修复建议
1. 修正asarUnpack配置
当前仅解压了Windows的查询引擎,Mac版本的引擎未被解压,导致asar压缩包无法执行二进制文件。修改asarUnpack:
"asarUnpack": [ "**/query-engine-windows.exe", "**/query-engine-darwin", "**/query-engine-darwin-arm64" ]
2. 确认数据库路径正确性
生产环境中Electron的应用路径与开发环境不同,需动态获取数据库路径。在代码中替换硬编码的URL:
// 主进程中获取正确路径 const path = require('path'); const dbPath = path.join(process.resourcesPath, 'prisma', 'nimbleStore2.db'); // 初始化Prisma Client时传入正确的DATABASE_URL const prisma = new PrismaClient({ datasources: { db: { url: `file:${dbPath}` } } });
3. 预生成Prisma客户端并验证二进制目标
执行以下命令确保为Mac架构预生成客户端:
prisma generate --binary-targets darwin,darwin-arm64
同时移除previewFeatures = ["napi"](NAPI预览特性可能在生产构建中存在兼容性问题,且非必须)。
4. 检查extraResources的路径匹配
确保prisma/nimblestore2.db在构建时被正确复制到resources目录,可修改为:
"extraResources": [ { "from": "prisma/nimbleStore2.db", "to": "prisma/nimbleStore2.db" }, "node_modules/.prisma/**/*", "node_modules/@prisma/client/**/*" ]
5. 临时启用生产日志排查
在主进程中添加Prisma日志配置,打包后可通过Mac控制台查看日志:
const prisma = new PrismaClient({ log: ['query', 'error', 'warn'] }); // 将日志输出到文件 const fs = require('fs'); const logStream = fs.createWriteStream(path.join(process.homedir(), 'nimble-prisma.log'), { flags: 'a' }); prisma.$on('query', (e) => { logStream.write(`Query: ${e.query}\nParams: ${e.params}\nDuration: ${e.duration}ms\n`); }); prisma.$on('error', (e) => { logStream.write(`Error: ${e.message}\n`); });
内容的提问来源于stack exchange,提问作者James Boswell
相关产品推荐
相关产品推荐

