10

问题

有没有一种方法可以node-sqlite3为我在我的应用程序中定位的多个平台安装,而无需为每个目标平台组合运行独立构建?

语境

在我的 Node.js 应用程序中,我有一个 npm 依赖项node-sqlite3GitHubnpm),其中包含针对不同平台的不同二进制文件(绑定)。

我的应用程序针对不同的平台,包括WindowsLinuxmacOSia32x64)以及现代 Node 版本:v6、v7 和 v8。该应用程序没有任何特定于平台的行为。

如果我使用 安装项目的依赖项npm installnode-sqlite3则仅为当前平台下载二进制文件(比如说win32, x64, Node v7.10)。

我还有一个 Travis CI 构建配置,用于持续部署和持续集成。我选择Ubuntu Trusty作为执行构建的主机。

作为构建过程的一部分,应用程序的依赖项由npm install. 在部署过程中,构建的应用程序及其依赖项被打包(存档)并上传到文件托管以供进一步分发。

问题

node-sqlite3没有为我需要的所有目标平台安装,而只是为当前正在使用的平台(用于开发或执行构建)安装。

可能的解决方案

我可以执行构建和部署:

  • 使用 Travis - 适用于 Linux 和 macOS
  • 使用 AppVeyor - 适用于 Windows

但这看起来像是一个很大的开销。正如我已经说过的,该应用程序没有任何特定于平台的行为。我相信node-sqlite3的供应商在我所针对的所有主要平台上都对其进行了测试。

4

1 回答 1

13

的,如果node-sqlite3你确实有这样的能力。

这是可能的,因为它的所有者mapbox使用node-pre-gypGitHubnpm)来分发node-sqlite3.

安装应用程序的依赖项后,在 Node 项目的根目录中为每个目标平台组合npm install 执行以下命令:

./node_modules/.bin/node-pre-gyp install
--directory=./node_modules/sqlite3
--target_platform={OS}
--target_arch={OS architecture}
--target={Node version}

(请注意,此处的换行符只是为了清楚起见,您必须在执行前删除或转义它们)

因此,您将需要在./node_modules/sqlite3/lib/binding/目录中绑定。

选项

这是node-pre-gyp 文档中的选项描述。

--directory : 在这个目录下运行命令

--target_platform=win32:传递目标平台并覆盖主机平台。有效值为 linux、darwin、win32、sunos、freebsd、openbsd 和 aix。

--target_arch=ia32:传递目标拱门并覆盖主机拱门。有效值为“ia32”、“x64”或 arm。

--target=0.10.25:传递目标节点或 node-webkit 版本进行编译

如果存在,将从文件存储 (Amazon S3)下载所选平台的预构建二进制文件。否则,您必须自己构建二进制文件。

可用的二进制文件列表node-sqlite3这里

例子

某些目标平台的几个示例:

• Windows x86 和节点 6.10.0:

./node_modules/.bin/node-pre-gyp install --directory=./node_modules/sqlite3 --target_platform=win32 --target_arch=ia32 --target=6.10.0

• macOS x64 和节点 7.10.0:

./node_modules/.bin/node-pre-gyp install --directory=./node_modules/sqlite3 --target_platform=darwin--target_arch=x64 --target=7.10.0

• Linux x64 和节点 8.0.0:

./node_modules/.bin/node-pre-gyp install --directory=./node_modules/sqlite3 --target_platform=linux--target_arch=x64 --target=8.0.0
于 2017-07-19T13:43:07.057 回答