为原生模块创建和打包预构建
npm install -g prebuildify
使用 prebuildify
,所有预构建的二进制文件都会打包在发布到 npm 的包中,这意味着不需要像 prebuild
那样单独下载。讽刺的是,这种方法下载所有平台的预构建二进制文件比作为安装脚本下载单个预构建二进制文件更快。
始终使用 prebuildify --@mafintosh
注意。
prebuildify@3
中的选项、环境变量和预构建名称已更改。请参阅以下文档。您还需要升级node-gyp-build
。
首先,进入您的原生模块目录并创建一系列预构建。
# 进入您的原生模块目录 cd your-native-module # 为所有 electron/node 二进制版本构建并去除符号 prebuildify --all --strip # 预构建文件将存储在 ./prebuilds 目录 ls prebuilds
如果您的模块使用 node 核心 Node-API(以前称为 N-API),那么您可以使用 --napi
标志进行预构建:
# 使用 node-api 预构建 prebuildify --napi
现在剩下的唯一要做的就是让您的模块在存在预构建的情况下使用它。
使用 node-gyp-build 来实现这一点。
# 首先安装 node-gyp-build npm install --save node-gyp-build
然后将 node-gyp-build
作为安装脚本添加到您模块的 package.json
中:
{ "name": "your-native-module", "scripts": { "install": "node-gyp-build" } }
安装脚本会检查是否有兼容的预构建包。如果有,它不会执行任何操作。如果没有,它会运行 node-gyp rebuild
来生成构建。
这意味着即使用户禁用了安装脚本,只要有兼容的预构建包,您的模块仍然可以工作(!)。
在 index.js
中加载原生绑定时,您也应该使用 node-gyp-build
以确保获得正确的绑定
// 如果存在编译好的构建或预构建,将加载它。 // 如果没有找到构建,将抛出异常 var binding = require('node-gyp-build')(__dirname) module.exports = binding
这种方法的一个额外好处是,只要您为所有版本生成预构建,您的原生模块就可以在多个 node 和 electron 版本中工作,而无需用户重新安装或重新编译。使用 Node-API,您只需要为每个运行时生成预构建。
发布模块到 npm 时,记得包含 ./prebuilds
文件夹。
就是这样!祝您原生开发愉快。
选项可以通过(按优先顺序)程序化 API、CLI 或环境变量提供。无论是否在外部定义,环境变量也可用于子进程。 例如,prebuildify --arch arm64 --strip
设置 PREBUILD_ARCH=arm64 PREBUILD_STRIP=1
。
CLI | 环境 | 默认值 | 描述 |
---|---|---|---|
--target -t | - | 取决于具体情况。 | 一个或多个目标* |
--all -a | - | false | 构建所有已知目标。<br>优先于 --target 。 |
--napi | - | true | 进行 Node-API 构建。<br>目标默认为最新的 node,兼容 Electron > 3,可以用 --target 覆盖。注意:目前应避免使用 --all ,因为它包括不支持 Node-API 的目标。 |
--electron-compat | - | false | 进行两个 Node-API 构建,一个用于 node,一个用于 Electron。如果您支持 Electron <= 3,这很有用。 |
--debug | - | false | 进行调试构建 |
--arch | PREBUILD_ARCH | os.arch() | 目标架构** |
--platform | PREBUILD_PLATFORM | os.platform() | 目标平台** |
--uv | PREBUILD_UV | 来自 process.versions.uv | 主要 libuv 版本*** |
--armv | PREBUILD_ARMV | 在 ARM 机器上自动检测 | 数字 ARM 版本(如 7)*** |
--libc | PREBUILD_LIBC | glibc ,Alpine 上为 musl | libc 类型*** |
--tag-uv | - | false | 用 uv 标记预构建*** |
--tag-armv | - | false | 用 armv 标记预构建*** |
--tag-libc | - | false | 用 libc 标记预构建*** |
--preinstall | - | - | 构建前运行的命令 |
--postinstall | - | - |