Prisma Client 在电子打包所有内容后找不到查询引擎

Posted

技术标签:

【中文标题】Prisma Client 在电子打包所有内容后找不到查询引擎【英文标题】:Prisma Client not finding query-engine after electron packages everything 【发布时间】:2021-08-29 21:10:09 【问题描述】:

我正在使用 Electron 和 Prisma(以及其他我们不必担心的)制作项目。我已经尝试解决这个错误好几个小时了:我无法让 Prisma 找到查询引擎可执行文件,我已经尝试了我在互联网上找到的 一堆 东西,但仍然没有.

我尝试设置 Prisma 将在哪里找到查询引擎,我找到了这个 repo the "solution",但它不起作用(至少对我来说不是):

这是我的 Prisma 架构:

datasource db 
    provider = "sqlite"
    url      = "file:./data.db"


generator client 
    provider = "prisma-client-js"
    binaryTargets = ["native"]
    output   = "../electron/database/generated/client"

我使用 webpack 来编译 Electron 和 React,所以我将 schema generate 设置为 Electron 文件夹,然后 webpack 将编译到“dist”文件夹。我使用copy-webpack-plugin 复制 schema.prisma 和 query-engine-windows.exe(这是我的操作系统)。毕竟我得到了这个错误:

r [PrismaClientKnownRequestError]: spawn C:\Users\Tiago Oliveira\programming\web-dev\electron-prisma-react-ts-passwordkeeper\packages\win-unpacked\resources\app.asar.unpacked\dist\query-engine-windows.exe ENOENT
    at C:\Users\Tiago Oliveira\programming\web-dev\electron-prisma-react-ts-passwordkeeper\packages\win-unpacked\resources\app.asar\dist\main.js:69:77852
    at c (C:\Users\Tiago Oliveira\programming\web-dev\electron-prisma-react-ts-passwordkeeper\packages\win-unpacked\resources\app.asar\dist\main.js:1:54711)
    at Generator._invoke (C:\Users\Tiago Oliveira\programming\web-dev\electron-prisma-react-ts-passwordkeeper\packages\win-unpacked\resources\app.asar\dist\main.js:1:54464)
    at Generator.throw (C:\Users\Tiago Oliveira\programming\web-dev\electron-prisma-react-ts-passwordkeeper\packages\win-unpacked\resources\app.asar\dist\main.js:1:55070)
    at asyncGeneratorStep (C:\Users\Tiago Oliveira\programming\web-dev\electron-prisma-react-ts-passwordkeeper\packages\win-unpacked\resources\app.asar\dist\main.js:1:195068)
    at s (C:\Users\Tiago Oliveira\programming\web-dev\electron-prisma-react-ts-passwordkeeper\packages\win-unpacked\resources\app.asar\dist\main.js:1:195340)
    at processTicksAndRejections (internal/process/task_queues.js:93:5) 
  code: 'ENOENT',
  clientVersion: '2.24.1',
  meta: undefined

事件使用此设置来获取应用程序路径并将路径设置在 qe(查询引擎)所在的位置,它说它不存在...?

import  app  from "electron"
import path from "path"
const qePath = path.join(
    app.getAppPath().replace("app.asar", "app.asar.unpacked"),
    "dist/query-engine-windows.exe"
)

const prisma = new PrismaClient(process.env.NODE_ENV === "production" ? 
    __internal: 
        engine: 
            binaryPath: qePath
        
    
 : )

为了确保我没有发疯,我沿着它所说的不存在的路径将它扔到控制台然后它就跑了!所以这里有问题。

如果您对文件的外观有任何疑问,可以通过this project repo 查询。

如果你想得到错误并尝试自己得到错误,只需克隆 repo 并执行 yarn 并运行“yarn package:exe”m,它将编译主文件夹,即 Electron,然后是 src React 文件夹,然后它会为 Electron 捆绑它,然后立即执行它:yarn package:exe will webpack-(all)>electron->execute.

【问题讨论】:

请阅读meta.***.com/questions/303812/…,其中讨论了为什么格式化文本比代码截图更可取。 这方面有什么更新吗?我也遇到了同样的问题。 还没有,很遗憾 【参考方案1】:

我从未使用过 prisma 或 electron,但根据我的 webpack 经验,有一些事情听起来很不正常:

webpack 擅长将 js 拉到一起,输出一些其他的文件。强制它复制粘贴文件感觉有点像代码异味——webpack 不理解 exe 文件,所以很可能它不应该管理它们 “schema.prisma”似乎是 js 使用的东西 - 我很惊讶它没有从需要的地方导入 exe 文件特定于操作系统 - 我希望 js 构建独立于平台,最重要的是需要构建代码并用执行文件包装它

总的来说,我希望架构会有所不同;但我不知道电子社区通常会做什么。

【讨论】:

所以如果你不知道,electron 是用来构建原生桌面应用程序的,它可以渲染 html 和许多前端(如果不是全部)框架。 Prisma 只是一个类似于数据管理器的 type-orm,它需要目录上的 .prisma 文件才能使用,它也需要可执行文件,因为我正在测试,我只是想确保它可以在 prod 上工作,我刚刚去了使用 Windows,在我知道如何操作之后,我最终也会添加其他平台。

以上是关于Prisma Client 在电子打包所有内容后找不到查询引擎的主要内容,如果未能解决你的问题,请参考以下文章

@prisma/client 尚未初始化。请运行“prisma generate”并尝试再次导入

@prisma/client 从 2.10.x 升级到 2.21.x 后没有定义 LogLevel

在 Prisma Client 中连接时如何不排序

eclipse打成jar包后找不到类,是怎么回事呢,主类文件打包时已经选了,虚拟机也装了,还是运行不了

vue打包后找不到资源路径问题

vue项目用webpack打包后运行后找不到.ttf及.woff文件