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

Rya*_*yan 29 javascript node.js npm electron

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

所以我从github快速入手,跑了

npm install && npm start
Run Code Online (Sandbox Code Playgroud)

随着这个轻松工作,我尝试安装和运行serialport

npm install serialport
Run Code Online (Sandbox Code Playgroud)

使用测试文件安装并运行正常,我尝试将两者合并并放入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)
Run Code Online (Sandbox Code Playgroud)

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

系统OS信息:

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.2 LTS
Release:    16.04
Codename:   xenial
Run Code Online (Sandbox Code Playgroud)

小智 46

当发生这种类型的版本不匹配时,您可以选择具有目标节点版本的电子分布,也可以重建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
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为您需要使用`./ node_modules/.bin/electron-rebuild`而不是`npm install`来重建电子模块(步骤2). (3认同)
  • 最大的问题是,然后你的构建将无法被Node使用:你将遇到相反的问题,节点会告诉你在需要51的时候为第53版编译它.这对于单元或集成测试来说是个问题,例如[ https://github.com/zeromq/zeromq.js/issues/144](https://github.com/zeromq/zeromq.js/issues/144) (2认同)
  • 我在哪里放置所有这些导出语句,以便将它们检入我的项目的repo,其他开发人员会在他们提取代码时自动设置它们?或者这是不必要的,因为我只需要运行一次? (2认同)

Jos*_*ter 9

electron-rebuildpostinstall.

根据您正在执行的操作,您可以使用电子重建来重建serialportelectron已安装的版本.

为此:

npm install --save-dev electron-rebuild

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

.\node_modules\.bin\electron-rebuild.cmd    # Windows.
Run Code Online (Sandbox Code Playgroud)

因为在进行npm安装后我一直忘记这样做(以及帮助其他下载项目的人),我将以下两个脚本添加到package.json:

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

  "postinstall": "electron-rebuild",    
  "electron-rebuild": "electron-rebuild"
},
Run Code Online (Sandbox Code Playgroud)

postinstall做了之后就会自动运行npm install的典型后,所以安装完成后,你会看到一个控制台日志消息electron-rebuild,它会自动重建serialport,以及任何其他本机库,您必须到electron版本.这意味着你甚至不必考虑electron-rebuild继续前进.

要手动重新运行,electron-rebuild只需运行它npm run electron-rebuild.

Easy-peezie,柠檬压榨!