我有一个存储库,其中包含我上传到 AWS 的 Lambda 的几个“微服务”。此外,我有一些共享库,我想在发送到 AWS 时将其打包。
因此我的目录结构如下:
/micro-service-1
/dist
package.json
index.js
/micro-service-2
/dist
package.json
index.js
/shared-component-1
/dist
package.json
component-name-1.js
/shared-component-2
/dist
package.json
component-name-2.js
基本部署利用方便的 node-lambda
npm 模块,但是当我使用如下语句引用本地共享组件时:
var sharedService = require('../../shared-component-1/dist/index');
这与 node-lambda run
命令配合使用效果很好,但 node-lambda deploy
会删除此本地依赖项。可能是有道理的,因为我正在我的依赖项中的“root”目录下面,所以我想也许我会利用 gulp 来完成这项工作,但我对它很陌生,所以我可能是做一些愚蠢的事情。我的策略是:
- 让
gulp deploy
依赖于 local-deps 任务 - local-deps 任务将:
npm build --production
到一个目录- 然后将此目录通过管道传输到
/local
目录下的微服务 - 清理共享中的安装
然后我会像这样引用所有共享组件:
var sharedService = require('local/component-name-1');
希望这能实现我想要实现的目标。这个策略有意义吗?我应该考虑更简单的方法吗?有没有人在“gulp speak”中有任何类似的例子?
最佳答案
我有一个答案! :D
TL;DR - 使用 npm link
链接在您的公共(public)组件和依赖组件之间创建一个符号链接(symbolic link)。
所以,我有一个只有两个模块的项目:
- main-module
- referenced-module
其中每一个都是一个 Node 模块。如果我 cd
进入 referenced-module
并运行 npm link
,然后 cd
进入 main-module
和 npm link referenced-module
,npm 将“安装”我的 referenced-module
到我的 main-module
并将其存储在我的node_modules
文件夹。注意:当运行第二个 npm link
时,项目名称是您在 package.json
中找到的名称,而不是目录名称(请参阅 npm link
文档,之前已链接)。
现在,在我的 main-module
中,我需要做的就是 var test = require('referenced-module')
我可以尽情使用它.请务必从您的referenced-module
module.exports
您的代码!
现在,当您压缩 main-module
以将其部署到 AWS Lambda 时,链接将被解析,真正的 模块将被放置在它们的位置!我已经对此进行了测试并且它可以工作,虽然还没有使用 node-lambda
,但我不明白为什么这应该是一个问题(除非它对包恢复做了一些不同的事情)。
这种方法的好处还在于,我对 referenced-module
所做的任何更改都会在开发过程中被我的 main-module
自动获取,所以我不需要不必运行任何 gulp 任务或任何东西来同步它们。
我发现这是一个非常好的、干净的解决方案,我能够在几分钟内让它工作。如果我上面描述的任何内容没有任何意义(因为我自己才刚刚发现这个解决方案!),请发表评论,我会尽力为您澄清。
2016 年 2 月更新
根据您的要求和您的应用程序的大小,可能有一个有趣的替代方案可以比使用符号链接(symbolic link)更优雅地解决这个问题。看看Serverless .这是构建无服务器应用程序的一种非常巧妙的方式,并且包括一些有用的功能,例如能够分配触发您正在编写的 Lambda 函数的 API 网关端点。它甚至允许您编写 CloudFormation 配置脚本,因此如果您有其他资源要部署,那么您可以在此处执行此操作。需要“测试版”或“产品”阶段?这也可以为你做。我已经使用它一个多星期了,虽然需要进行一些设置并且事情并不总是像您想要的那样清晰,但它非常灵活并且支持社区很好!
关于node.js - 在部署到 lambda 时包括本地依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33511652/