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

时间:2018-08-18 02:01:49

标签: node.js sqlite electron

这类似于此Electron Uncaught Error: A dynamic link library (DLL) initialization routine failed

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)

我已经尝试了本文中建议的所有内容以及我能找到的其他内容

我已经安装了electronic-rebuild并添加了“ rebuild”:“ electron-rebuild -f -w sqlite3 -V 1.7”

此程序运行无错误。

我尝试了“ postinstall”:“ install-app-deps”,

这没有帮助。

还有什么可以尝试的吗?

文件在其中。

enter image description here

1 个答案:

答案 0 :(得分:2)

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

平台

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

警告:这是一个HACK,可以正常工作,因为在此过程中我没有使用任何期望完整电子环境的东西。从字面上看,仅是为了使其找到正确的本机绑定。一个更正确的解决方法是研究改为electron-builder构建node-v57-win32-x64

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

后安装

"scripts": {
  ...
  "postinstall": "electron-builder install-app-deps"
}

这应该在运行npm installyarn install时尝试重建本机依赖关系。如果您有project/app目录,它们将被放置在project/app/node_modules/中。否则,他们会进入project/node_modules

传递依赖

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

• rebuilding native production dependencies platform=linux arch=x64
• rebuilding native dependency name=sqlite3

Windows版本显示:

• no native production dependencies

此问题已通过将传递性依赖项添加为直接依赖项来解决。完成此操作后,电子组装人员开始拿起包装进行编译,并且吐出了错误。

Windows Build

要纠正这些错误:

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

在这一点上,我说这是我的“半解”。 应该是基本电子项目设置的完整解决方案。

纱线工作区

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

yarn-workspace-project/
  workspace/
    project/
      web-app/
    project-electron/
      app/

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

但是,在project-electron中运行我的启动脚本时,electron .在查找本机绑定时遇到了一些问题。使用sqlite3的软件包安装在yarn-workspace-project/node_modules下,因此将sqlite3解析为yarn-workspace-project/node_modules/sqlite3。每个yarn install确实存在这种情况,但是电子束缚被放在yarn-workspace-project/workspace/project-electron/app/node_modules/sqlite3中。

有很多明显的解决方案,所以我将其留给读者练习。这里的关键问题是,为node-v57-win32-x64下载的默认绑定(我想呢?我不记得他们正在构建它们)在Windows 10上无法像在Linux / OS X上那样直接使用,即使错误表明它们不存在(它们确实存在)。