Electron 在 Windows 上运行 SQLlite 3 - 动态链接库 (DLL) 初始化例程失败

bee*_*eek 5 sqlite node.js electron

这类似于这个电子未捕获错误:动态链接库(DLL)初始化例程失败

ELECTRON_ASAR.js:173
        return old.apply(this, arguments)
                   ^

Error: A dynamic link library (DLL) initialization routine failed.
\\?\C:\workspace\client\client\desktop\node_modules\sqlite3\lib\binding\node-v57
-win32-x64\node_sqlite3.node
    at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:173:20)
    at Object.Module._extensions..node (module.js:671:18)
    at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:173:20)
    at Module.load (module.js:561:32)
    at tryModuleLoad (module.js:504:12)
    at Function.Module._load (module.js:496:3)
    at Module.require (module.js:586:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (C:\workspace\client\client\desktop\node_modules\sqlit
e3\lib\sqlite3.js:4:15)
    at Object.<anonymous> (C:\workspace\client\client\desktop\node_modules\sqlit
e3\lib\sqlite3.js:190:3)
Run Code Online (Sandbox Code Playgroud)

我已经尝试了这篇文章中建议的所有内容以及我能找到的任何其他内容

我已经安装了电子重建并添加了“重建”:“电子重建 -f -w sqlite3 -V 1.7”

这是运行没有错误。

我试过 "postinstall": "install-app-deps",

这没有帮助..

还有什么可以尝试的吗?

文件在那里..

在此处输入图片说明

小智 3

这最终成为我这边一堆不同问题的混搭。我将从最简单的开始,然后从那里开始。

\n\n

平台

\n\n

你的错误表明它想要node-v57-win32-x64,但如果你从 Electron 运行它应该是electron-v2.0-win32-x64(或者electron-v1.7-win32-x64如果你使用的是旧版本)。我也遇到了这个问题,因为我正在sqlite3子进程中运行。Electron 中的子进程位于完整的节点上下文中,而不是 Electron(浏览器或节点+浏览器)上下文中。我通过环境变量将 Electron 版本从主浏览器进程 ( process.versions.electron) 传递到子进程并process.versions.electron在子进程中将其设置来修复此问题。

\n\n

警告:这是一个 HACK 并且有效,因为我没有在该过程中使用任何需要完整 Electron 环境的东西。它实际上只是为了让它找到正确的本机绑定。更正确的解决方法是考虑进行electron-builder构建node-v57-win32-x64

\n\n

说到这里,接下来让我们创建它们。

\n\n

安装后

\n\n
"scripts": {\n  ...\n  "postinstall": "electron-builder install-app-deps"\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

npm install这应该在运行或时尝试重建您的本机依赖项yarn install。如果您有project/app目录,它们将被放置在project/app/node_modules/. 否则他们就会进去project/node_modules

\n\n

传递依赖

\n\n

就我而言,sqlite3实际上是我的依赖集中另一个包的传递依赖。在 Linux/OS X上electron-builder正确选择了这些并在安装程序创建期间显示了这一点:

\n\n
\xe2\x80\xa2 rebuilding native production dependencies platform=linux arch=x64\n\xe2\x80\xa2 rebuilding native dependency name=sqlite3\n
Run Code Online (Sandbox Code Playgroud)\n\n

Windows 版本显示:

\n\n
\xe2\x80\xa2 no native production dependencies\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过将传递依赖项添加为直接依赖项来修复此问题。在我这样做之后,电子构建器开始拾取该包进行编译,并吐出错误。

\n\n

Windows 构建

\n\n

要修复这些错误:

\n\n
    \n
  • 安装python(我用的是最新的2.7)
  • \n
  • 安装Microsoft Build Tools 2013并重新启动
  • \n
  • 再次运行你的postinstall脚本
  • \n
\n\n

这就是我所说的“解决了一半”的地方。这应该是基本电子项目设置的完整解决方案。

\n\n

纱线工作区

\n\n

我使用纱线工作区功能,我的项目设置如下:

\n\n
yarn-workspace-project/\n  workspace/\n    project/\n      web-app/\n    project-electron/\n      app/\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于这种设置,yarn install一般是在yarn-workspace-projectyarn-workspace-project/workspace目录中运行,而不是在每个项目中运行。这会生成一个位于 的提升node_modules/目录yarn-workspace-project/node_modules。创建打包版本时,electron-builder从该提升位置获取依赖项,一切都会运行。

\n\n

project-electron然而,当在 中运行我的启动脚本时,electron .在查找本机绑定时遇到了一些问题。使用 sqlite3 的软件包安装在 下yarn-workspace-project/node_modules,因此解析sqlite3yarn-workspace-project/node_modules/sqlite3。这肯定是存在的yarn install,但是电子结合被放入了yarn-workspace-project/workspace/project-electron/app/node_modules/sqlite3

\n\n

对此有多种明显的解决方案,因此我将其作为练习留给读者。这里的关键问题是,下载的默认绑定(我想?我不记得它们是被构建的)node-v57-win32-x64在 Windows 10 上不能像在 Linux / OS X 上那样开箱即用,即使错误表明它们不存在(它们确实存在)。

\n