prebuildify
为原生模块创建和打包预构建
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 | 构建所有已知目标。 优先于 --target 。 |
--napi | - | true | 进行 Node-API 构建。 目标默认为最新的 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 | - | - | 构建后运行的命令 |
--shell | PREBUILD_SHELL | Android 上为 'sh' | 用于生成命令的 shell |
--artifacts | - | - | 包含额外文件的目录。 递归复制到预构建目录中。 |
--strip | PREBUILD_STRIP | false | 启用 剥离 |
--strip-bin | PREBUILD_STRIP_BIN | 'strip' | 自定义剥离二进制文件 |
--node-gyp | PREBUILD_NODE_GYP | 'node-gyp(.cmd)' | 自定义 node-gyp 二进制文件**** |
--quiet | - | false | 抑制 node-gyp 输出 |
--cwd | - | process.cwd() | 工作目录 |
* 目标的形式为 (runtime@)?version
,其中 runtime
默认为 'node'
。例如:-t 8.14.0 -t electron@3.0.0
。必须指定 --target
、--all
或 --napi
中的至少一个。
** arch
选项作为 --arch
传递给 node-gyp
。目标架构和平台(您正在为其构建)默认为主机平台和架构(您正在其上构建)。可以为交叉编译覆盖它们,在这种情况下,您可能还想覆盖剥离二进制文件。平台和架构决定了输出文件夹(供 node-gyp-build
在运行时查找)。例如,在 Linux x64 上,预构建文件最终位于 prebuilds/linux-x64
中。arch
选项也可以是由 +
分隔的多架构值(例如 x64+arm64
用于通用二进制文件),主要用于决定输出文件夹;只有第一个架构会传递给 node-gyp
。
*** 预构建文件的文件名由标签组成,默认包括运行时和 napi
或 abi<version>
。例如:electron.abi40.node
。要创建更具体的预构建(供 node-gyp-build
选择),您可以添加额外的标签。这些标签的值是自动检测的。例如,如果主机机器具有 ARM 架构,--napi --tag-uv --tag-armv
可能会生成一个名为 node.napi.uv1.armv8.node
的构建。在交叉编译时,您可以通过相关选项(--tag-armv --armv 7
)或标签(--tag-armv 7
)作为快捷方式来覆盖值。它们是分开的,因为您可能想要构建特定版本而不将预构建标记为该版本,假设预构建是向前兼容的。
**** 启用使用分支如 nodejs-mobile-gyp
。
许可证
MIT