likes
comments
collection
share

Electron iohook编译方案

作者站长头像
站长
· 阅读数 117

一、  iohook介绍

www.npmjs.com/package/ioh…

Node.js 全局本地键盘和鼠标监听器,同样适用于Electron。

二、  ABI介绍

原生Node.js模块由Electron支持,但由于Electron具有与给定Node.js不同的 应用二进制接口 (ABI)(由于使用Chromium的 BoringSL 而不是 OpenSSL 等 差异),您使用的原生模块需要为Electron重新编译。 否则,当您尝试运行您的应用程序时, 将会遇到以下的错误:

Error: The module '/path/to/native/module.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION $XYZ. This version of Node.js requires
NODE_MODULE_VERSION $ABC. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).

2.1 Electron的ABI版本

通过node-abi库(npm库)进行获取。

2.2 Node.js的ABI版本

通过node-abi库(npm库)进行获取,或者通过process.versions.modules获取。

三、  针对Electron的编译方案

由于iohook官方的github仓库很难编译出适用于Electron 22.3.4版本的C++ Addon,于是改用下面的两个库进行编译。

3.1 Mystk/iohook库

仓库地址:github.com/MystK/iohoo…

该仓库是fork的iohook仓库,能编译出4.0.0版本到22.0.0版本的Electron C++ Addon。

3.1.1编译ia32架构

$ cd D:/case-study
$ mkdir electron-iohook-ia32-demo
$ cd electron-iohook-ia32-demo
$ npm init -y # 初始化编译项目,在该步骤中,修改package.json,新增如下配置:
"iohook": {
    "targets": [
      "node-93",
      "electron-110"
    ],
    "platforms": [
      "win32"
    ],
    "arches": [
      "x64",
      "ia32"
    ]
}
$ mkdir node_modules
$ cd node_modules
$ git clone https://github.com/MystK/iohook.git # 克隆仓库
$ cd iohook
$ nvm use 16.17.1 32 # 切换编译环境为ia32
$ yarn # 给仓库安装编译所需的依赖
$ export npm_config_target=22.3.4 # 设置环境变量
$ export npm_config_arch=ia32
$ export npm_config_target_arch=ia32
$ export npm_config_disturl=https://electronjs.org/headers
$ export npm_config_runtime=electron
$ export npm_config_build_from_source=true
$ npm run build # 执行编译脚本

3.1.2编译x64架构

$ cd D:/case-study
$ mkdir electron-iohook-x64-demo
$ cd electron-iohook-x64-demo
$ npm init -y # 初始化编译项目,在该步骤中,修改package.json,新增如下配置:
"iohook": {
    "targets": [
      "node-93",
      "electron-110"
    ],
    "platforms": [
      "win32"
    ],
    "arches": [
      "x64",
      "ia32"
    ]
}
$ mkdir node_modules
$ cd node_modules
$ git clone https://github.com/MystK/iohook.git # 克隆仓库
$ cd iohook
$ nvm use 16.17.1 64 # 切换编译环境为x64
$ yarn # 给仓库安装编译所需的依赖
$ export npm_config_target=22.3.4 # 设置环境变量
$ export npm_config_arch=x64
$ export npm_config_target_arch=x64
$ export npm_config_disturl=https://electronjs.org/headers
$ export npm_config_runtime=electron
$ export npm_config_build_from_source=true
$ npm run build # 执行编译脚本

3.1.3编译产物以及使用方式

至此,已完成iohook的全部编译工作,包含ia32和x64两种架构的Electron C++ Addon,分别在如下的两个项目中:

● D:/case-study/electron-iohook-ia32-demo

● D:/case-study/electron-iohook-x64-demo

编译的产物在均在各自项目的node_modules/iohook/build/release目录里,包含iohook.node和uiohook.lib两个文件。使用时,需要通过node_modules/iohook/index.js进行引用。在node_modules/iohook/index.js中有一处代码需要注意,就是拼接modulePath变量的地方,这里使用了process.arch进行拼接,注意,在windows平台下,不论当前的编译环境是ia32或者是x64,该值均返回ia32,因此这里是不正确的。因此需要对这里进行改造,鉴于此情况,我把iohook编译后的产物单独封装成了一个小的插件进行使用,目录如下:

Electron iohook编译方案

Electron iohook编译方案 上述的demo示例是根据x64的情况进行封装的。那么在有的项目里,需要同时兼容32位和64位的系统该怎么办?此时应该在项目里封装iohook-x64和iohook-x86插件,根据当前的arch架构,来决定引用哪一个插件即可。关于早node中如何精确判断arch,上面已经说过了,不要使用process.arch进行判断,可以自己在网上搜索一下如何在node环境中精确判断arch架构。

3.2 arifnpm/iohook库

仓库地址:github.com/arifnpm/ioh…

该仓库是fork的iohook仓库,并编译出来了多个版本的Addon可供直接使用。

四、  针对Node.js的编译方案

针对纯Node.js环境(非Electron项目)的编译非常简单,过程如下:

$ cd D:/case-study
$ mkdir node-iohook-ia32-demo
$ cd node-iohook-ia32-demo
$ npm init -y
$ mkdir node_modules
$ cd node_modules
$ git clone https://github.com/wilix-team/iohook.git
$ cd iohook
$ nvm use 16.17.1 ia32
$ cp build_def/win32/binding.gyp ./bingding.gyp
$ cp build_def/win32/uiohook.gyp ./uiohook.gyp
$ npm run build

以该种方式编译出来的产物在build/release/目录中。

五、  被隐藏的node-gyp

为什么要说是被隐藏的node-gyp,因为在三、四中讲到的编译方式,全都没有直接涉及到node-gyp命令行的使用,所以这里要特别介绍一下node-gyp。node-gyp是C++ Addon的编译工具,要想把自己编写的C或C++代码编译成Node Addon插件,就必须使用node-gyp进行编译。node-gyp的使用方式请参考node官方文档的介绍nodejs.org/docs/latest…nodejs.org/docs/latest…

关于node-gyp的核心内容,有以下四点:

● 在项目根目录中必须要要有一个binding.gyp的编译入口文件。

● 使用node-gyp configure命令生成编译配置文件。

● 使用node-gyp build命令进行编译。

● 编译后的文件在build/release/目录中。

上述第三、第四节中讲到的npm run build命令,调用的是node_modules/iohook/build.js脚本,build.js脚本进行编译时使用的就是node-gyp工具,可以自行阅读node_modules/iohook/build.js源码了解详细情况。

六、  参考链接

● Electron官网关于Node原生模块的编译介绍

www.electronjs.org/zh/docs/lat…

● Node ABI介

nodejs.org/docs/latest…

● node-gyp介绍

github.com/nodejs/node… nodejs.org/docs/latest… nodejs.org/docs/latest…

转载自:https://juejin.cn/post/7377439806135910452
评论
请登录