跨平台安装npm包sqlite3。

11

问题

是否有一种方法可以在我的应用程序中为我所针对的多个平台安装node-sqlite3,而不需要单独为每个目标平台组合运行独立构建?

背景

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

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

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

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

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

问题

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

可能的解决方案

我可以执行构建和部署:

  • 使用Travis - 用于Linux和macOS
  • 使用AppVeyor - 用于Windows
    • 但这似乎是一个很大的开销。正如我之前所说,该应用程序没有任何特定于平台的行为。而且我相信node-sqlite3的供应商已经测试了我所针对的所有主要平台。
1个回答

16

是的,使用node-sqlite3的情况下,您确实具有这样的能力。

这是可能的,因为它的所有者mapbox 使用 node-pre-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、darwin、win32、sunos、freebsd、openbsd和aix。

--target_arch=ia32: 传递目标架构并覆盖主机架构。有效值为'ia32'、'x64'或arm。

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

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

node-sqlite3可用二进制文件的列表在此处

示例

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

• Windows x86和Node 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和Node 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 和 Node 8.0.0:

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

有一件事让我感到困惑,但我最终解决了——我的错误信息提到了缺少 lib/binding/node-v48-linux-x64/node_sqlite3.node。尽管这里写着 node-v48,但你应该使用 node -v 命令的输出作为参数。在我的情况下,它是 6.9.4 - Zach Thacker
嗨@Deilan,你能提供Linux armv7的示例吗? - krishna
您可以在 https://github.com/TryGhost/node-sqlite3/releases/ 找到 node-sqlite3 的版本发布。然后,您可以从错误消息中匹配所需的版本和目标参数,例如: Error: Cannot find module 'C:\snapshot\modbus\node_modules\sqlite3\lib\binding\napi-v6-win32-unknown-x64\node_sqlite3.node'要在 Linux 构建过程中包含 Windows sqlite3 节点,您需要执行以下操作: /node_modules/.bin/node-pre-gyp install --directory=./node_modules/sqlite3 --target_platform=win32 --target_arch=x64 --target=16.15.0 --target_libc=unknown - ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接