0

我不确定哪个平台/工具是我问题的根源,所以在 SO 而不是 Git-Hub 存储库之一的问题上提出这个问题。我正在尝试开发一个基于Polyonic的项目。Polyonic 本身是一种 Electron 和 Ionic2 的种子混搭。我的项目还使用node-serialport,它是一个本地模块。

我的开发版本是: - Node 7.4.0 - Electron 1.6.10

...并ionic info在我的项目的 src 文件夹中运行给出:

global packages:

    @ionic/cli-utils : 1.4.0
    Cordova CLI      : 7.0.1 
    Gulp CLI         : CLI version 3.9.1 Local version 3.9.1
    Ionic CLI        : 3.4.0

local packages:

    @ionic/app-scripts              : 1.3.7
    @ionic/cli-plugin-cordova       : 1.4.0
    @ionic/cli-plugin-gulp          : 1.0.1
    @ionic/cli-plugin-ionic-angular : 1.3.1
    Cordova Platforms               : browser 4.1.0
    Ionic Framework                 : ionic-angular 3.3.0

System:

    Node       : v7.4.0
    OS         : Linux 4.6
    Xcode      : not installed
    ios-deploy : not installed
    ios-sim    : not installed
    npm        : 4.0.5

如果我npm install在 src 目录中执行,然后npm install在根目录中,npm start在根目录中(在捆绑 Ionic 项目的 Polyonic 种子中运行 gulp 脚本),项目启动并完美运行,节点串行端口没有问题。

如果我通过electron builder在项目的根目录中运行来构建可执行文件,然后在 Chrome DevTools 控制台中运行该可执行文件,我会得到以下输出:

Uncaught Error: The module '/home/vic/git/MyProject/build/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/vic/git/MyProject/build/node_modules/bindings/bindings.js:76:44)
    at Object.<anonymous> (/home/vic/git/MyProject/build/node_modules/serialport/lib/bindings.js:3:35)

我认识到关于 SO 的其他相关问题建议使用electron-rebuild以确保根据 Electron 预期的节点版本构建本机模块。但是如果我进入项目 src 文件夹,然后运行:

rm -rf node_modules/serialport/build/* 
node_modules/.bin/electron-rebuild -w serialport -f 

...然后回到我的项目根文件夹并运行npm start(它像以前一样正常运行),然后运行electron-builder并运行可执行文件,在 Chrome DevTools 控制台中,我得到以下输出:

Uncaught Error: Cannot find module 'serialport'
    at Module._resolveFilename (module.js:470)
    at Function.Module._resolveFilename (/tmp/.mount_7laJTZ/usr/bin/resources/electron.asar/common/reset-search-paths.js:35)
    at Function.Module._load (module.js:418)
    at Module.require (module.js:498)
    at require (internal/module.js:20)
    at Object.<anonymous> (main.js:73788)
    at __webpack_require__ (main.js:20)
    at Object.<anonymous> (main.js:72414)
    at __webpack_require__ (main.js:20)
    at Object.<anonymous> (main.js:111408)

electron-rebuild与我做这件事之前相比,这感觉离工作更远了。我哪里错了?任何帮助或建议将不胜感激。

4

2 回答 2

2

如果您将在下一小时内将项目发送给我,我将调查问题所在。你不需要使用 electron-rebuild - electron-builder 会自动重建。(我是电子生成器维护者。)

于 2017-07-02T17:10:17.547 回答
2

在使用@develar 离线处理后,我们能够解决问题。我在这里发帖并接受他的回答,以在应得的地方给予信用。

这个对 Polyonic 项目的 PR是一个直接的结果。然而,据我估计,关键变化是将根 package.json 的构建块修改为:

"build": {
  "appId": "YOUR.APPID.GOES.HERE",
  "directories": {
    "app": "build"
   }
},

...并确保电子位于 devDependencies 部分而不是 dependencies 部分。

这里的关键点是 Polyonic,当您运行时将npm start所有内容捆绑起来并将其放入项目根目录中的构建文件夹中。然后它运行cd build && electron .以运行启动项目。根据电子生成器文档:

  • 目录

    • buildResources = build String - 构建资源的路径。
    • output = dist String - 输出目录。
    • app String - 应用程序目录(包含应用程序 package.json),默认为 app、www 或工作目录。

...所以将 build.directories.app 设置为 'build' 告诉电子构建器打包构建目录,这正是我所需要的。

于 2017-07-02T20:46:55.733 回答