我试图在带有电子的子进程中使用sqlite3模块,但是我得到了未定义符号的错误。而且,只有当我从电子的node.js运行程序时才会发生错误,但是当我从通常的node.js运行程序时,一切都很好。我认为这个问题可能与sqlite3模块的“本土化”有关,我尝试了electron-rebuild,npm --build-from-source,它们没有帮助。
main.js:
const { fork } = require('child_process');
fork('fork');fork.js:
const sqlite3 = require('sqlite3');package.json:
{
"name": "bugreproduce_sqlite",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"sqlite3": "^4.0.2"
},
"devDependencies": {
"electron": "^3.0.5"
}
}产出:
> ./node_modules/electron/dist/electron .
/home/myuser/Programming/javascript/bugreproduce_sqlite/node_modules/electron/dist/electron: symbol lookup error: /home/myuser/Programming/javascript/bugreproduce_sqlite/node_modules/sqlite3/lib/binding/node-v64-linux-x64/node_sqlite3.node: undefined symbol: _ZN2v816FunctionTemplate3NewEPNS_7IsolateEPFvRKNS_20FunctionCallbackInfoINS_5ValueEEEENS_5LocalIS4_EENSA_INS_9SignatureEEEiNS_19ConstructorBehaviorENS_14SideEffectTypeE发布于 2018-10-20 13:59:35
我找到了根本问题。这是相关的问题和拉动请求1,拉动请求2 on GitHub。
我暂时解决这个问题的步骤是:
checkout到sqlite3想要的版本(目前为0.10.3)npm install ../path/to/patched/node-pre-gyp安装此修补节点-prenpm i --build-from-source sqlite3(不确定是否需要此命令)和主项目文件夹中的./node_modules/.bin/electron-rebuild (我安装了电子重建)fork,如下所示:
fork('fork', [], { env: { ELECTRON_VERSION: "3.0.5" }});这是一次黑客攻击,但似乎奏效了。希望问题能在上游得到解决。
编辑:固定拉请求链接(我使用第二个拉请求,而不是第一个)
发布于 2019-06-25 13:44:16
我通过以下方式解决了同样的问题:
"postinstall": "electron-builder install-app-deps"放在package.json中的npm脚本中。关于这一问题发生的原因:
get_process_runtime in versioning.js)通过观察process.versions.electron来判断这个过程是否是电子过程.否则,它将假定为节点进程。process.versions.electron不是在分叉进程的电子(v5)版本中实现的,所以Node -pre假设节点进程并返回到node-v70-win32-x64的路径,而该路径是不存在的,因为用于npm install node-sqlite3的节点版本不同于分叉进程向节点-pre报告的节点版本。我的node_modules/sqlite3/lib/binding目录中确实有node_modules/sqlite3/lib/binding。electron-v5.0-win32-x64中正确地创建了node_modules/sqlite3/lib/binding,但node将node-v70-win32-x64返回到节点-sqlite3 3,当然也找不到模块。因此,最后一部分是更新到电子v6,它将电子版本报告给分叉的进程,允许节点预回转检测一个电子过程,并将正确的路径返回给电子生成器创建的二进制程序,在本例中是node_modules/sqlite3/lib/binding/electron-v6.0-win32-x64。发布于 2020-04-11 09:59:59
这只是我的两分钱,因为这些问题可能非常耗时:我还在分叉一个依赖于电子应用程序的sqlite3的进程。
我的设置和工作方式如下(电子表格v8.0.1):
有两个项目文件夹,“父”和“子”。父项目是带有主代码和呈现程序代码的电子项目。
在父母中:
devDependency: electron-builderelectron-builder install-app-depsnpm i之后自动运行这应该注意重建sqlite3对抗电子。
现在,让子进程使用这个库。
externals: {
sqlite3: 'commonjs sqlite3'
},(这样webpack就不会尝试捆绑sqlite3,因为它不适用于本机模块。
回到父母:
假设输出包名为"child.js",将其复制到父文件夹,并将其添加到“Electre-builder.json”文件中的files属性,例如files: ["!*.log", "!doc", ..., "child.js"]。就像这样,子程序被添加到应用程序根目录下的asar存档中。不要使用电子生成器的extraFiles/extraResources,试着像那样叉孩子,你的孩子找不到sqlite3。
在应用程序的"main.ts“文件中,将孩子作为
fork(path.resolve(app.getAppPath(), 'child.js')这应该行,希望这对任何人都有帮助。
https://stackoverflow.com/questions/52897950
复制相似问题