【问题标题】:Cross-platform install of npm package sqlite3npm 包 sqlite3 的跨平台安装
【发布时间】:2017-12-24 20:04:58
【问题描述】:

问题

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

上下文

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

我的应用面向不同的平台,包括 WindowsLinuxma​​cOSia32 >x64) 和现代 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 的供应商在我所针对的所有主要平台上都对其进行了测试。

【问题讨论】:

    标签: node.js npm cross-platform travis-ci node-sqlite3


    【解决方案1】:

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

    这是可能的,因为它的所有者mapbox 使用node-pre-gypGitHubnpm)来分发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 docs 的选项描述。

    --directory:在该目录下运行命令

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

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

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

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

    node-sqlite3 的可用二进制文件列表是here

    示例

    针对特定目标平台的几个示例:

    • 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
    

    【讨论】:

    • 有些事情让我感到困惑,但我想通了 - 我的错误消息是关于缺少 lib/binding/node-v48-linux-x64/node_sqlite3.node。即使这里显示node-v48,您也应该使用node -v 的任何输出作为参数。就我而言,它是6.9.4
    • 嗨@Deilan,你能提供linux armv7的例子吗
    猜你喜欢
    • 2016-10-27
    • 1970-01-01
    • 2012-05-13
    • 2016-05-11
    • 2023-03-25
    • 2011-10-21
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多