在 Electron Vite 项目中使用 Prisma
本文最后更新于 2024年10月20日 中午
我是用 Electron Vite + Prisma + SQlite 做了个项目 Schedule,在用 electron-builder + nsis 打包的时候遇到了问题。
完成这件事会遇到两个问题
1. 数据库在 dev 和 prod 环境路径不同,Prisma 可能找不到数据库
2. 由于 @prisma/client 的代码是 Prisma 根据
*.prisma 文件生成的,不在 dependencies 中,可能不会被打包
问题一
prima 文件中默认 dev 环境的数据库 1
2
3
4
5// src/prisma/schema.prisma
datasource db {
provider = "sqlite"
url = "file:./dev.db"
}
electron-builder.yml 把 prod 数据库打包进 resources/
1
2
3# electron-builder.yml
extraResources:
- 'database/**/*'
实例化 PrismaClient 的时候根据 is.dev 计算数据库路径
dbPath,然后覆盖配置 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// src/main/client.ts
import { is } from '@electron-toolkit/utils'
import { PrismaClient } from '@prisma/client'
import path from 'path'
const globalForPrisma = globalThis as unknown as { prisma: PrismaClient }
const dbPath = is.dev ? 'dev.db' : path.join(process.resourcesPath, "database/prod.db")
// 保证只有一个实例
export const prisma =
globalForPrisma.prisma || new PrismaClient({
datasources: {
db: {
url: `file:${dbPath}`,
},
}
})
问题二
直接打包运行会报错
一个简单的解决方法是把 .prisma 和 @prisma/client 当作 extraResources 打包进去
1 |
|
安装后,resources/ 下就会出现 node_modules 文件夹,运行也不再报错
详细改动可以参考这个模板