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

Cross-compile node module with native bindings with node-gyp

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

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

我怎样才能 cross-compile/install 一个节点模块(具体来说,node-sqlite3),所以当我将它上传到另一个服务器时,它 运行s?

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

根据您的具体情况,我会使用 Vagrant。 Vagrant 可以在几秒钟内创建虚拟机并配置它们。

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

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

与 Robert 的回答相同,当我不得不在另一个 OS 中处理我的 MAC 时,我使用像 Oracle 的免费虚拟器 VirtualBox 这样的 vm ware 来获得 linux 在我的 mac 上,我没有任何费用。或者注册一个新的 AWS 账户,你可以免费获得一个 micro。使用它来获取您的 linux 盒子,在那里做任何您需要的事情。

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

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

您可以在这里阅读原始答案:

实现它的步骤:

  1. 生成新的 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.

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

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

    sudo yum install git gcc-c++
    
  5. 最后,将您的应用克隆到新的 EC2 并安装应用的依赖项:

    nvm use 0.10.36
    npm install --production
    
  6. 然后您可以使用 scp 等轻松下载 node_modules。