使用 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 可以在几秒钟内创建虚拟机并配置它们。
- 找到一个类似于 Amazon Linux 发行版(Fedora、CentOS、其他使用
yum
作为包管理器的 OS 图像 - 请参阅 Wiki )
- 使用一个简单的配置脚本,当 Vagrant 在机器启动时 运行 时,将 运行
npm install
(可选地它也可能删除 node_modules文件夹之前确保干净安装)
- 为了更加舒适,脚本还可以创建用于部署的 zip 文件
- 安装完成后,脚本将关闭虚拟机以避免不必要的系统资源消耗
- 部署!
如果链接库不在目标机器上的同一位置,则可能需要进行一些调整,但在我看来,这通常是最好和最快的解决方案。
与 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 尽可能。
您可以在这里阅读原始答案:
实现它的步骤:
生成新的 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。
我正在使用 AWS Lambda,这涉及创建我的 node.js 脚本的存档,包括 node_modules
文件夹并将其上传到他们的基础设施 运行.
这很好用,除非涉及到具有本机绑定的节点模块(使用 node-gyp)。因为在我的本地计算机 (OS X) 上完成了绑定和项目存档,所以它与 AWS (Amazon Linux) 服务器不兼容。
我怎样才能 cross-compile/install 一个节点模块(具体来说,node-sqlite3),所以当我将它上传到另一个服务器时,它 运行s?
虽然不能真正解决您的问题,但一个非常简单的解决方法是在 Linux 机器上简单地编译本机插件。
根据您的具体情况,我会使用 Vagrant。 Vagrant 可以在几秒钟内创建虚拟机并配置它们。
- 找到一个类似于 Amazon Linux 发行版(Fedora、CentOS、其他使用
yum
作为包管理器的 OS 图像 - 请参阅 Wiki ) - 使用一个简单的配置脚本,当 Vagrant 在机器启动时 运行 时,将 运行
npm install
(可选地它也可能删除 node_modules文件夹之前确保干净安装) - 为了更加舒适,脚本还可以创建用于部署的 zip 文件
- 安装完成后,脚本将关闭虚拟机以避免不必要的系统资源消耗
- 部署!
如果链接库不在目标机器上的同一位置,则可能需要进行一些调整,但在我看来,这通常是最好和最快的解决方案。
与 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 尽可能。
您可以在这里阅读原始答案:
实现它的步骤:
生成新的 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。