使用 node-gyp 交叉编译具有本机绑定的节点模块

Posted

技术标签:

【中文标题】使用 node-gyp 交叉编译具有本机绑定的节点模块【英文标题】:Cross-compile node module with native bindings with node-gyp 【发布时间】:2015-08-01 03:44:27 【问题描述】:

我正在使用 AWS Lambda,这涉及创建我的 node.js 脚本的存档,包括 node_modules 文件夹并将其上传到他们的基础设施以运行。

这很好用,除非涉及到具有本机绑定的节点模块(使用 node-gyp)。因为绑定是在我的本地计算机 (OS X) 上编译和存档的,所以它与 AWS 的 (Amazon Linux) 服务器不兼容。

如何交叉编译/安装节点模块(特别是 node-sqlite3),以便在将其上传到另一个服务器架构时运行?

【问题讨论】:

您是否尝试过使用 node-pre-gyp? node-sqlit3 已经在使用它,因此您在游戏中处于领先地位。 IIRC,它应该将构建卸载到 Amazon S3,因此您可以针对 Amazon Linux(AWS Lambda 的操作系统)进行编译。 是的,我看到 node-sqlite3 使用 node-pre-gyp,但我并没有真正理解这对我意味着什么或如何使用它来实现我想要的。 我知道这涉及额外费用,但我建议将广告构建打包到另一个 s3 盒子上。然后将其转移到您的生产环境。请注意,如果您在 linux 环境中执行 npm i,如果您拥有所需的构建工具,一切都可以开箱即用。 这有帮助吗? ***.com/questions/25797424/… 它基本上是说你需要有正确的环境变量让它知道要使用哪个编译器。 是的,这是一个开始,但我不知道我需要什么编译器或将环境变量设置为什么。我试过查找并找到我需要的东西,但发现这样做太难了。 【参考方案1】:

虽然不能真正解决您的问题,但一个非常简单的解决方法可能是在 Linux 机器上简单地编译本机插件。

对于您的特殊情况,我会使用Vagrant。 Vagrant 可以在几秒钟内创建并配置虚拟机。

    查找类似于 Amazon 的 Linux 发行版(Fedora、CentOS 以及其他使用 yum 作为软件包管理器的操作系统 - 请参阅 Wiki)的操作系统映像 使用一个简单的配置脚本,当 Vagrant 在机器启动时运行该脚本时,它将运行 npm install(可选地,它还可以在之前删除 node_modules 文件夹以确保干净安装) 为了更加舒适,脚本还可以创建用于部署的 zip 文件 安装完成后,脚本将关闭虚拟机以避免不必要的系统资源消耗 部署!

如果链接的库不在目标计算机上的同一位置,则可能需要进行一些调整,但在我看来,这通常是最好和最快的解决方案。

【讨论】:

虽然它可能无法解决我的问题,但它确实解决了我的问题。谢谢 - 我会调查一下 我很想看到一个“真正的”解决方案;我想在树莓派上安装 node-sqlite。 @RichardTurner 这应该没有问题 - 只需 npm install 在目标机器上。 @rossman 是的,你说得对,我只需要添加一些交换来解决内存不足的问题。【参考方案2】:

与罗伯特的回答相同,当我不得不在不同的操作系统中处理我的 MAC 时,我使用像 Oracle 的免费虚拟器 VirtualBox 这样的 vm ware 在我的 mac 上安装 linux,这对我来说是免费的。或者注册一个新的 AWS 账户,您可以免费获得一年的 micro。用它来获得你的 linux 机器,在那里做任何你需要的事情。

【讨论】:

【参考方案3】:

AWS 有一个页面描述如何处理原生 NPM 模块:https://aws.amazon.com/blogs/compute/nodejs-packages-in-lambda/

【讨论】:

【参考方案4】:

虽然在某些情况下使用 Vagrant 安装应用程序可能就足够了,但我发现有必要在 尽可能接近 Lambda 的 Amazon Linux AMI 的 Linux 上构建应用程序

您可以在此处阅读原始答案:https://***.com/a/34019739/303184

使其工作的步骤:

    生成新的 EC2 实例。确保它基于与您的 AWS Lambda 运行时完全相同的图像。您可以在此处查看 Lambda 环境详细信息:http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html。在我们的例子中,它是名为 amzn-ami-hvm-2015.03.0.x86_64-gp2 的 Amazon Linux AMI。

    安装 nvm 并使用它来安装与 AWS Lambda 上相同版本的 Node.js。在撰写本文时,它是 v0.10.36。您可以再次参考http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html了解。

    您可能需要在 EC2 上安装 git & g++ 编译器。你可以这样做运行

    sudo yum install git gcc-c++

    最后,将您的应用克隆到新的 EC2 并安装应用的依赖项:

    nvm use 0.10.36
    npm install --production
    

    然后您可以使用scp 等轻松下载node_modules。

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review @Eloims 我已按要求附上了完整的解决方案。

以上是关于使用 node-gyp 交叉编译具有本机绑定的节点模块的主要内容,如果未能解决你的问题,请参考以下文章

如何让 node-gyp 在 Windows 7 平台上工作

多部分标识符无法与交叉应用绑定到具有 OPENQUERY 的链接服务器功能

Windows 使用 node-gyp

node-gyp编译问题

phonegap vs sencha touch 需要澄清

autotools,如果找不到交叉编译器,如何失败