如何为 Electron 重建原生 npm 模块?

Posted

技术标签:

【中文标题】如何为 Electron 重建原生 npm 模块?【英文标题】:How to rebuild native npm modules for Electron? 【发布时间】:2017-08-07 15:35:18 【问题描述】:

请帮助我了解如何为 Electron 1.6.2 重建本机 npm 模块?

我使用https://electron.atom.io/docs/tutorial/quick-start 中的步骤创建了一个简单的 Electron 应用程序。 然后我安装了 ref 包并将其加载到 main.js 中。 ref 包 - 它是本机包。我必须重建这个包才能在 Electron 应用程序中使用它。

我使用以下教程重建原生包 - https://github.com/electron/electron/blob/master/docs/tutorial/using-native-node-modules.md

有 3 种方法可以重建原生 npm 包:

1) “使用 electron-rebuild 为 Electron 安装模块和重建”: 我安装了electron-rebuild npm 包。 然后,根据教程,我只需要运行以下命令:

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

但 electron-rebuild 尝试下载 https://atom.io/download/electron/v1.6.2/iojs-v1.6.2.tar.gz 如果 Electron 发布文件位于此处 - https://github.com/electron/electron/releases,为什么它会从 https://atom.io/download/electron 下载一些东西? Electron 1.6.2 仅在几周前发布,但 iojs-v1.6.2.tar.gz 于 2015 年 3 月发布。 我是否正确理解 electron-rebuild 下载了错误的文件?

2) 使用 node-gyp 为 Electron 手动构建包。

set HOME=%USERPROFILE%/.electron-gyp  
cd ./node_modules/ref  
node-gyp rebuild --target=1.6.2 --arch=x64 --dist-url=https://atom.io/download/electron  

这里 dist-url 再次使用https://atom.io/download/electron。 为什么? 我试过不要使用--dist-url。 但在这种情况下,node-gyp 会下载以下文件:

gyp http GET https://iojs.org/download/release/v1.6.2/iojs-v1.6.2.tar.gz  
gyp http 200 https://iojs.org/download/release/v1.6.2/iojs-v1.6.2.tar.gz  
gyp http GET https://iojs.org/download/release/v1.6.2/SHASUMS256.txt  
gyp http GET https://iojs.org/download/release/v1.6.2/win-x64/iojs.lib  
gyp http GET https://iojs.org/download/release/v1.6.2/win-x86/iojs.lib  
gyp http 200 https://iojs.org/download/release/v1.6.2/SHASUMS256.txt  
gyp http 200 https://iojs.org/download/release/v1.6.2/win-x64/iojs.lib  
gyp http 200 https://iojs.org/download/release/v1.6.2/win-x86/iojs.lib 

对吗?

3) 使用 npm 重建原生包:

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

再次https://atom.io/download/electron. 为什么?

有人知道如何正确重建 Electron 1.6.2 的 ref 原生包吗?

【问题讨论】:

这里没有问题,dist URL是正确的。这是发布镜像/托管的地方 @MarshallOfSound 我不明白。 Electron 1.6.2 于 15 天前发布。 iojs.org/download/release/v1.6.2/iojs-v1.6.2.tar.gz 创建于 2 年前 - 2015 年 3 月 23 日。为什么 electron-rebuild 使用非常旧的 iojs-v1.6.2.tar.gz 用新的 Electron 1.6.2 重建原生 npm 包? 它不是,由于遗留构建系统的工作方式,在这种情况下 1.6.2 被认为是 iojs 1 和 3 之间的任何节点版本。这就是 node-gyp 的编写方式,因此电子名称以一种使其工作的方式文件存在 @MarshallOfSound 为什么是节点版本?根据教程,我应该指定 Electron 的版本。请参阅github.com/electron/electron/blob/master/docs/tutorial/… # Electron 的版本。 export npm_config_target=1.2.3 ... --target=1.2.3 是 Electron 的版本。 ... electron-rebuild --help 用法:electron-rebuild --version [version] --module-dir [path] 选项:-v, --version 要构建的 Electron 版本 这是正确的,但重要的是要记住,Electron 在内部使用 node,因此所有以 node 为目标的构建工具,如 node-gyp 都被有效地欺骗为认为 Electron 是 nodejs。在这种情况下,我们告诉 node-gyp 使用来自这个 URL 的 nodejs 头文件和这个版本的 Electron 重建这个本地节点模块。该版本仅用于获取正确的头文件而已。我不确定您的实际问题是什么,因为您提供的所有示例都来自文档并且是正确的 【参考方案1】:

你是对的,给 node-gyp 的版本映射到 Electron 版本而不是内部节点版本,因为那是标头上传到的版本。这一切背后实际上有一个更复杂的解释,但这对最终用户来说并不重要。您提供的代码是正确的并且来自文档。有用。无需了解其内部运作原理。

【讨论】:

好的,我明白了。现在我使用以下命令重建 ref 包: cd .\node_modules\ref "D:\\tools\\nodejs\\node.exe" "C:\\tmp\\test\\node_modules\\node-gyp\\ bin\\node-gyp.js" "重建" "--target=1.6.1" "--arch=x64" "--build-from-source" --nodedir=D:\tools\iojs-v1. 6.1 它有效。但是当我设置 --arch=ia32 时,Electron 会抱怨“错误:%1 不是有效的 Win32 应用程序”。可能是什么问题? 是否有关于 node 和 electron 原生模块构建差异的文档? 我在 Ubuntu 18.04 上面临同样的问题。我的node版本是8.10.0,npm版本是6.4.1,electron版本是3.0.10。根据您的评论,Ubuntu OS 的“--nodedir=D:\tools\iojs-v1.6.1”参数应该是什么??

以上是关于如何为 Electron 重建原生 npm 模块?的主要内容,如果未能解决你的问题,请参考以下文章

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

Electron 使用Node原生模块

如何为 Electron 应用程序服务 Django

如何为 Electron / Atom Shell App 设置应用程序图标

如何为用打字稿编写的 npm 包指向索引文件

Electron builder - 如何为生产 Windows 可执行文件构建 loadURL