为电子安装模块时节点模块版本冲突

Posted

技术标签:

【中文标题】为电子安装模块时节点模块版本冲突【英文标题】:node module version conflict when installing modules for electron 【发布时间】:2017-07-25 18:07:29 【问题描述】:

我正在尝试制作一个从我的串行端口读取数据的电子应用程序 (https://electron.atom.io/)。一般来说,我是网络技术的新手,我知道一些 javascript,但我是一个 c++ 人。

所以我从 github 中提取了他们的快速入门,然后运行 ​​

npm install && npm start

通过这个简单的工作,我尝试安装和运行串行端口

npm install serialport

安装并运行良好的测试文件后,我尝试将两者结合起来并将require('serialport') 放入 index.html 文件中。有了这个,我得到了这个错误:

Uncaught Error: The module '/home/user/Documents/Programing/Git/Arduino-mpu6050/electron-quick-start/node_modules/serialport/build/Release/serialport.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 51. This version of Node.js requires
NODE_MODULE_VERSION 53. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or`npm install`).
    at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:173:20)
    at Object.Module._extensions..node (module.js:598:18)
    at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:173:20)
    at Module.load (module.js:488:32)
    at tryModuleLoad (module.js:447:12)
    at Function.Module._load (module.js:439:3)
    at Module.require (module.js:498:17)
    at require (internal/module.js:20:19)
    at bindings (/home/user/Documents/Programing/Git/Arduino-mpu6050/electron-quick-start/node_modules/bindings/bindings.js:76:44)
    at Object.<anonymous> (/home/user/Documents/Programing/Git/Arduino-mpu6050/electron-quick-start/node_modules/serialport/lib/bindings.js:3:35)

任何想法如何解决它?我没有使用两个不同版本的 Node,为什么会出现此错误。

系统操作系统信息:

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.2 LTS
Release:    16.04
Codename:   xenial

【问题讨论】:

【参考方案1】:

当发生这种类型的版本不匹配时,您可以选择具有目标 Node 版本的电子发行版或重建 npm 包。由于 Electron 的发行版跳过了使用 NODE_MODULE_VERSION 51 配置的 Node v7.0.0(并跳转到 v7.4.0),因此您必须重新构建 serialport 包。

在您应用的目录(package.json 所在的位置)中,

1.安装electron-rebuild

npm install --save-dev electron-rebuild

2。重建

./node_modules/.bin/electron-rebuild

或者,甚至是更好的选择 - 从一开始就设置环境变量。

# Electron's version.
export npm_config_target=1.6.1
# The architecture of Electron, can be ia32 or x64.
export npm_config_arch=x64
export npm_config_target_arch=x64
# Download headers for Electron.
export npm_config_disturl=https://atom.io/download/electron
# Tell node-pre-gyp that we are building for Electron.
export npm_config_runtime=electron
# Tell node-pre-gyp to build module from source code.
export npm_config_build_from_source=true
# Install all dependencies, and store cache to ~/.electron-gyp.
HOME=~/.electron-gyp npm install

查看 Electron 的文档页面,了解如何使用原生 Node 模块。 https://electron.atom.io/docs/tutorial/using-native-node-modules/

【讨论】:

我认为您需要使用./node_modules/.bin/electron-rebuild 而不是npm install 来重建电子模块(步骤2)。 最大的问题是你的构建将不能被 Node 使用:你会遇到相反的问题,node 会告诉你你编译它的版本是 53 而你需要 51。这是有问题的用于单元或集成测试,例如 https://github.com/zeromq/zeromq.js/issues/144 我应该把所有这些导出语句放在哪里,以便将它们检入我的项目的存储库中,而其他开发人员在提取代码时会自动设置它们?或者这是不必要的,因为我只需要运行一次? 艾萨克,你的终端。【参考方案2】:

electron-rebuildpostinstall

根据您的操作,您可以使用 electron-rebuildserialport 重建为您已安装的 electron 版本。

这样做:

npm install --save-dev electron-rebuild

$(npm bin)/electron-rebuild                 # Mac and Linux.

.\node_modules\.bin\electron-rebuild.cmd    # Windows.

因为我在执行 npm install 后总是忘记执行此操作(并且为了帮助其他下载该项目的人),我将以下两个脚本添加到 package.json

"scripts": 
  "start": "electron .",

  "postinstall": "electron-rebuild",    
  "electron-rebuild": "electron-rebuild"
,

postinstall 将在执行 npm install 后自动运行,因此在典型安装完成后,您将看到带有 electron-rebuild 的控制台日志消息,它将自动重建 serialport,以及您拥有的任何其他本机库, 到electron 版本。这意味着您甚至不必考虑继续运行electron-rebuild。 ?

要手动重新运行electron-rebuild,只需使用npm run electron-rebuild 运行即可。

小便,柠檬汁!

【讨论】:

【参考方案3】:

使用内容创建文件.npmrc

runtime = electron
target = 1.7.5
target_arch = x64
disturl = https://atom.io/download/atom-shell
export npm_config_runtime=electron
export npm_config_build_from_source=true

打开另一个终端并运行npm install [yourpackage]

记住,一些新的包会安装最高的电子版本(目标),所以不要让自己头疼/背痛,用 npm 或 github 上的当前版本更新你的target =页面。

【讨论】:

以上是关于为电子安装模块时节点模块版本冲突的主要内容,如果未能解决你的问题,请参考以下文章

当***模块及其子模块之一作为单独版本单独导入时,如何解决冲突的 go 模块依赖关系?

iOS 14 链接模块标志“矮人版本”:ID 具有冲突行为

Android Gradle 插件Android 依赖管理 ⑤ ( Gradle 依赖优化 | 命令行查看依赖模块 | 依赖冲突问题 | 依赖传递冲突 | 分库冲突 | 依赖分组不同导致冲突 )

maven dependency的版本冲突问题

Grails / Groovy / GGTS:运行应用程序上的模块版本冲突

有事务冲突时节点怎么加入MGR集群