如何为电子版本 4.1.4 重建 zeromq.js 绑定?

Posted

技术标签:

【中文标题】如何为电子版本 4.1.4 重建 zeromq.js 绑定?【英文标题】:How can I rebuild zeromq.js bindings for electron version 4.1.4? 【发布时间】:2019-09-15 09:42:35 【问题描述】:

在尝试在 Electron 应用程序中使用 zeromq.js 时,我发现 NODE_MODULE_VERSIONS 似乎不匹配:

Uncaught Error: Cannot open /home/XXXX/ptt_geo/ptt-geo-fork/src/webapp/node_modules/zeromq/build/Release/zmq.node: Error: The module '/home/XXXX/ptt_geo/ptt-geo-fork/src/webapp/node_modules/zeromq/build/Release/zmq.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 64. This version of Node.js requires
NODE_MODULE_VERSION 69. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).
    at Object.<anonymous> (vendor.js:217837)
    at Object../node_modules/zeromq/build/Release/zmq.node (vendor.js:217838)
    at __webpack_require__ (runtime.js:79)
    at Object../node_modules/zeromq/lib/index.js (vendor.js:217866)
    at __webpack_require__ (runtime.js:79)
    at Object../node_modules/zeromq/index.js (vendor.js:217850)
    at __webpack_require__ (runtime.js:79)
    at Object../src/app/services/aic-contact-listener.service.ts (main.js:4042)
    at __webpack_require__ (runtime.js:79)
    at Object../src/app/components/map/map.component.ts (main.js:1874)

根据网上的说法,我需要使用以下命令重建zeromq.js:

 npm rebuild zeromq --runtime=electron --target=<ELECTRON_VERSION>

所以我为我的电子版本(4.1.4)运行它并在重建时收到以下错误:

gyp WARN install got an error, rolling back install
gyp ERR! configure error 
gyp ERR! stack Error: 404 response downloading https://nodejs.org/dist/v4.1.4/node-v4.1.4-headers.tar.gz
gyp ERR! stack     at Request.<anonymous> (/usr/lib/node_modules/npm/node_modules/node-gyp/lib/install.js:214:14)
gyp ERR! stack     at Request.emit (events.js:194:15)
gyp ERR! stack     at Request.onRequestResponse (/usr/lib/node_modules/npm/node_modules/request/request.js:1066:10)
gyp ERR! stack     at ClientRequest.emit (events.js:189:13)
gyp ERR! stack     at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:556:21)
gyp ERR! stack     at HTTPParser.parserOnHeadersComplete (_http_common.js:109:17)
gyp ERR! stack     at TLSSocket.socketOnData (_http_client.js:442:20)
gyp ERR! stack     at TLSSocket.emit (events.js:189:13)
gyp ERR! stack     at addChunk (_stream_readable.js:284:12)
gyp ERR! stack     at readableAddChunk (_stream_readable.js:265:11)
gyp ERR! System Linux 3.10.0-693.el7.x86_64
gyp ERR! command "/usr/local/lib/nodejs/node-v10.15.3-linux-x64/bin/node" "/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /home/XXXX/ptt_geo/ptt-geo-fork/src/webapp/node_modules/zeromq
gyp ERR! node -v v10.15.3
gyp ERR! node-gyp -v v3.8.0
gyp ERR! not ok 
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! zeromq@5.1.0 install: `node scripts/prebuild-install.js || (node scripts/preinstall.js && node-gyp rebuild)`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the zeromq@5.1.0 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

这个错误是在 gcc 成功构建库文件之后出现的,并且似乎表明它正在尝试获取版本 4.1.4 的 node.js 标头,该版本不存在。

在引擎盖下,电子重建的东西使用了node-abi,所以我挖得更深一些并做了一些实验,无论我将电子作为运行时传递给什么,node-abi 都在尝试使用目标作为节点来确定要抓取哪些标题而不是电子。这可以验证,例如,通过传递

npm rebuild --zeromq --runtime=electron --target=5.0.0

这会成功重建,并且应该指示使用电子 5.0 进行构建,它的 NODE_MODULE_VERSION 为 70,但是如果我再次构建并查看 Electron 错误,我会得到一个 NODE_MODULE_VERSION 为 47(相对于所需的 69),它对应到 5.0.0 的 node.js 版本!

我已经多次验证了这一点,当我传入与现有 node.js 版本匹配的目标时,我会在 Electron 错误中返回匹配的 NODE_MODULE_VERSION。因此,考虑到文档可能是错误的,并且目标应该是 node.js 版本而不是 Electron 版本,我输入了与我的 Electron 构建相关的 node.js 版本:

npm rebuild zeromq --runtime=electron --target=10.11.0

只是让 node-abi 回来说“我不明白:”

Error: Could not detect abi for version 10.11.0 and runtime electron.  Updating "node-abi" might help solve this issue if it is a new release of electron
    at getAbi (/home/XXXX/ptt_geo/ptt-geo-fork/src/webapp/node_modules/node-abi/index.js:30:9)
    at module.exports (/home/XXXX/ptt_geo/ptt-geo-fork/src/webapp/node_modules/prebuild-install/rc.js:71:57)
    at Object.<anonymous> (/home/XXXX/ptt_geo/ptt-geo-fork/src/webapp/node_modules/prebuild-install/bin.js:9:25)
    at Module._compile (internal/modules/cjs/loader.js:701:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
    at Module.load (internal/modules/cjs/loader.js:600:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
    at Function.Module._load (internal/modules/cjs/loader.js:531:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:754:12)
    at startup (internal/bootstrap/node.js:283:19)

这与我在 node-abi 的 index.js 中看到的内容相匹配(那里没有告诉它对节点版本 10.11.0 做什么)。

这是某种错误,如果是,是否有推荐的解决方法?

使用的软件版本:

电子:4.1.4

Zeromq:5.1.0

节点:10.11.0

Node-abi:2.8.0(今天发布,耶...?)

【问题讨论】:

大概您需要针对特定​​操作系统的绑定。如果有,是哪一个? Linux,特别是 RHEL 7,但 zeromq 和 electron-rebuild 文档是否可信并不重要。 【参考方案1】:

我今天刚用 Electron 6 遇到了这个问题。npm rebuild zeromq 没有帮助,因为它首先从他们的 github 下载二进制文件,并且二进制文件似乎是用错误的版本编译的。

对于任何有同样问题的人,这对我来说是手动重建的:

cd node_modules/zeromq/

HOME=~/.electron-gyp node-gyp rebuild --target=6.0.0 --arch=x64 --dist-url=https://electronjs.org/headers

【讨论】:

以上是关于如何为电子版本 4.1.4 重建 zeromq.js 绑定?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 electron + react js + next 进行生产构建

如何为 WooCommerce 添加电子邮件验证功能

如何为电子(一个 nodejs 库)配置 Intellisense?

如何为 Xcode 持续集成配置电子邮件设置

如何为无效的电子邮件地址编写基本检查[重复]

如何为 Kendo UI jQuery 的电子表格重新加载数据?