在 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
2
3
4
# electron-builder.yml
extraResources:
- 'node_modules/.prisma/**/*'
- 'node_modules/@prisma/client/**/*'

安装后,resources/ 下就会出现 node_modules 文件夹,运行也不再报错

详细改动可以参考这个模板

参考


在 Electron Vite 项目中使用 Prisma
https://term-inator.github.io/2023/07/23/use-prisma-with-electron/
作者
Sicong Chen
发布于
2023年7月23日
更新于
2024年10月20日
许可协议