首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在分叉过程中需要sqlite3本机模块时电子崩溃

在分叉过程中需要sqlite3本机模块时电子崩溃
EN

Stack Overflow用户
提问于 2018-10-19 18:17:08
回答 3查看 1.1K关注 0票数 4

我试图在带有电子的子进程中使用sqlite3模块,但是我得到了未定义符号的错误。而且,只有当我从电子的node.js运行程序时才会发生错误,但是当我从通常的node.js运行程序时,一切都很好。我认为这个问题可能与sqlite3模块的“本土化”有关,我尝试了electron-rebuildnpm --build-from-source,它们没有帮助。

main.js:

代码语言:javascript
运行
复制
const { fork } = require('child_process');
fork('fork');

fork.js:

代码语言:javascript
运行
复制
const sqlite3 = require('sqlite3');

package.json:

代码语言:javascript
运行
复制
{
  "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"
  }
}

产出:

代码语言:javascript
运行
复制
> ./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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-20 13:59:35

我找到了根本问题。这是相关的问题拉动请求1拉动请求2 on GitHub。

我暂时解决这个问题的步骤是:

  • 克隆节点-前gyp git存储库
  • checkout到sqlite3想要的版本(目前为0.10.3)
  • 从第二个拉请求中应用修补程序
  • 通过主项目文件夹中的npm install ../path/to/patched/node-pre-gyp安装此修补节点-pre
  • npm i --build-from-source sqlite3(不确定是否需要此命令)和主项目文件夹中的./node_modules/.bin/electron-rebuild (我安装了电子重建)
  • 使用电子版本集调用fork,如下所示: fork('fork', [], { env: { ELECTRON_VERSION: "3.0.5" }});

这是一次黑客攻击,但似乎奏效了。希望问题能在上游得到解决。

编辑:固定拉请求链接(我使用第二个拉请求,而不是第一个)

票数 1
EN

Stack Overflow用户

发布于 2019-06-25 13:44:16

我通过以下方式解决了同样的问题:

  1. 将电子更新为v6 Beta。Version 6具有获取分叉过程中的电子版本所需的特性。
  2. 使用电子生成器的“install”命令作为后置脚本,这意味着将"postinstall": "electron-builder install-app-deps"放在package.json中的npm脚本中。

关于这一问题发生的原因:

  • 节点- sqlite 3的主模块使用节点-pre来确定编译的sqlite二进制文件需要哪些。
  • node-pre尝试检测进程运行时,以将路径返回到进程/平台的正确二进制文件。
  • node的检测功能(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
票数 0
EN

Stack Overflow用户

发布于 2020-04-11 09:59:59

这只是我的两分钱,因为这些问题可能非常耗时:我还在分叉一个依赖于电子应用程序的sqlite3的进程。

我的设置和工作方式如下(电子表格v8.0.1):

有两个项目文件夹,“父”和“子”。父项目是带有主代码和呈现程序代码的电子项目。

在父母中:

  1. 包含为devDependency: electron-builder
  2. 添加为postinstall脚本electron-builder install-app-deps
  3. 如果这是在立即添加电子生成器,运行后手动安装。将来它会在npm i之后自动运行

这应该注意重建sqlite3对抗电子。

现在,让子进程使用这个库。

  1. 子进程开发也依赖sqlite,所以只需在本地安装即可。
  2. 我使用webpack捆绑了所有js文件。
  3. 为了让webpack在后台工作,我补充说
代码语言:javascript
运行
复制
externals: {
    sqlite3: 'commonjs sqlite3'
  },

(这样webpack就不会尝试捆绑sqlite3,因为它不适用于本机模块。

回到父母:

假设输出包名为"child.js",将其复制到父文件夹,并将其添加到“Electre-builder.json”文件中的files属性,例如files: ["!*.log", "!doc", ..., "child.js"]。就像这样,子程序被添加到应用程序根目录下的asar存档中。不要使用电子生成器的extraFiles/extraResources,试着像那样叉孩子,你的孩子找不到sqlite3。

在应用程序的"main.ts“文件中,将孩子作为

代码语言:javascript
运行
复制
fork(path.resolve(app.getAppPath(), 'child.js')

这应该行,希望这对任何人都有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52897950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档