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

时间:2015-05-20 04:44:39

标签: node.js amazon-web-services cross-compiling node-gyp aws-lambda

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

这种方法很好,除了涉及具有本机绑定的节点模块(使用node-gyp)。由于绑定已在我的本地计算机(OS X)上进行编译和项目存档,因此它与AWS(Amazon Linux)服务器不兼容。

如何交叉编译/安装节点模块(具体来说,node-sqlite3),这样当我将其上传到另一个服务器时,它会运行吗?

4 个答案:

答案 0 :(得分:9)

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

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

  1. 查找类似于亚马逊Linux发行版的操作系统映像(Fedora,CentOS,其他使用yum作为程序包管理器的人 - 请参阅Wiki
  2. 使用一个简单的配置脚本,当Vagrant在机器启动时运行时,它将运行npm install(可选择它还可以删除 node_modules 文件夹,以确保安装干净)
  3. 为了更加舒适,脚本还可以创建用于部署的zip文件
  4. 安装完成后,脚本将关闭VM以避免不必要的系统资源消耗
  5. 部署<!/ LI>

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

答案 1 :(得分:2)

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

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

使其发挥作用的步骤:

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

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

  3. 您可能需要安装git&amp; EC2上的g ++编译器。你可以运行

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

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

答案 2 :(得分:1)

与Robert的回答相同,当我不得不在不同的操作系统中处理我的MAC时,我使用vm ware就像Oracle的免费虚拟器VirtualBox一样在我的mac上安装linux,这对我来说没有任何代价。或者注册一个新的AWS账户,您可以免费获得一年的微观账户。用它来获取你的linux盒子,做你需要的任何事情。

答案 3 :(得分:1)

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