跨平台安装npm包sqlite3

有没有一种方法来安装node-sqlite3我在我的应用程序中定位的多个平台,而不是针对每个目标平台组合运行独立构build?

上下文

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

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

如果我使用npm install来安装项目的依赖关系, node-sqlite3只为当前平台(比如win32x64Node v7.10 )下载二进制文件。

我还有一个Travis CI构buildconfiguration,我用它来连续部署以及持续集成。 我selectUbuntu Trusty作为执行构build的主机。

作为构build过程的一部分,应用程序的依赖关系由npm install 。 在部署过程中,将构build的具有依赖项的应用程序打包(存档)并上传到托pipe文件以供进一步分发。

问题

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

可能的scheme

我可以执行构build和部署:

  • 与特拉维斯 – Linux和MacOS
  • 与AppVeyor – 对于Windows

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

是的 ,在node-sqlite3情况下,你有这样的能力。

这是可能的,因为它的所有者mapbox使用node-pre-gyp gyp ( GitHub , npm )来分发node-sqlite3

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

 ./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,达尔文,win32,sunos,freebsd,openbsd和aix。

–target_arch = ia32 :传递目标拱,并覆盖主机拱。 有效值是'ia32','x64'或arm。

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

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

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