跨平台安装npm包sqlite3
题
有没有一种方法来安装node-sqlite3
我在我的应用程序中定位的多个平台,而不是针对每个目标平台组合运行独立构build?
上下文
在我的Node.js应用程序中,我有一个npm依赖node-sqlite3
( GitHub , npm ),它包含不同平台的不同二进制文件(绑定)。
我的应用程序针对不同的平台,包括Windows , Linux和MacOS (包括ia32和x64 )以及现代节点版本:v6,v7和v8。 该应用程序没有任何特定于平台的行为。
如果我使用npm install
来安装项目的依赖关系, node-sqlite3
只为当前平台(比如win32
, x64
, Node 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