我有一个由几个“微服务”组成的存储库,我将其上载到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
删除了此本地依赖项。可能是有道理的,因为我要在依赖项中的“根”目录下移动,所以我认为也许我可以利用 gulp 来完成这项工作,但是我对此实在有些新手,所以我可能在做一些蠢事。我的策略是:gulp deploy
取决于本地Deps任务npm build --production
到目录/local
目录var sharedService = require('local/component-name-1');
希望这能实现我想要的目标。这个策略有意义吗?我应该考虑一种更简单的方法吗?有没有人在“口头表达”中有类似这样的例子?
最佳答案
我对此有一个答案! :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')
,我可以将其用于我的内心内容。请确保从module.exports
中对代码进行referenced-module
!现在,当您压缩
main-module
并将其部署到AWS Lambda时,链接已解析,实际模块已放置到位!我已经对此进行了测试,并且可以使用node-lambda
进行测试,尽管我不明白为什么这应该是一个问题(除非它与软件包还原有所不同)。这种方法的优点还在于,在开发过程中,我对
referenced-module
所做的任何更改都会自动由我的main-module
接受,因此我不必运行任何gulp任务或任何同步它们的任务。我发现这是一个很好的,干净的解决方案,并且几分钟之内就可以使它正常工作。如果上述内容没有任何意义(因为我自己才发现此解决方案!),请发表评论,我会尽力为您澄清。
2016年2月更新
根据您的要求和您的应用程序的大小,可能有一个有趣的替代方法,它比使用符号链接(symbolic link)更为优雅地解决了该问题。看一看Serverless。这是构造无服务器应用程序的一种很巧妙的方法,并且包括有用的功能,例如能够分配API Gateway端点来触发您正在编写的Lambda函数。它甚至允许您编写CloudFormation配置的脚本,因此,如果您有其他资源要部署,则可以在此处进行。需要一个“beta”或“prod”阶段?这也可以为您做。我已经使用了一个多星期,尽管需要进行一些设置,而且事情并不总是如您所愿,但是它非常灵活,并且支持社区很好!