我有一个回购,其中包括几个"微服务"我上传到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 任务npm build --production
到目录/local
目录然后我会引用所有共享组件,如:
var sharedService = require('local/component-name-1');
希望这能成为我努力实现的目标。这种策略有意义吗?我应该考虑更简单的方法吗?有没有人在" gulp speak"?
中有任何类似的例子答案 0 :(得分:5)
我有一个答案! :d
TL; DR - 使用npm link
链接在公共组件和相关组件之间创建符号链接。
所以,我有一个只有两个模块的项目:
- main-module
- referenced-module
这些都是节点模块。如果我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
文档)。< / p>
现在,在我的main-module
我需要做的只是var test = require('referenced-module')
,我可以将它用于我的内心。请务必module.exports
referenced-module
main-module
您的代码。{/ 1>
现在,当您压缩node-lambda
以将其部署到AWS Lambda时,链接将得到解决,并且真正的模块将放在其位置!我已经测试了这个并且它可以工作,但不是referenced-module
,但是我不明白为什么这应该是一个问题(除非它与包恢复有所不同)。
这种方法的优点还在于,我对main-module
所做的任何更改都会在开发过程中由我的gcc -pedantic
自动获取,因此我无需执行任何gulp任务或任何操作同步它们。
我发现这是一个非常好的,干净的解决方案,我能够在几分钟内完成它。如果我上面描述的任何内容都没有任何意义(因为我自己刚刚发现了这个解决方案!),请发表评论,我会尽力为你澄清。
2016年2月更新
根据您的要求和应用程序的大小,可能有一个有趣的替代方案,比使用符号链接更优雅地解决了这个问题。看看Serverless。这是构建无服务器应用程序的一种非常简洁的方式,并包含有用的功能,例如能够分配触发您正在编写的Lambda函数的API网关端点。它甚至允许您编写CloudFormation配置脚本,因此如果您有其他资源要部署,那么您可以在此处执行此操作。需要'beta'或'prod'阶段?这也可以帮到你。我已经使用它一个多星期了,虽然有一些设置要做,事情并不总是如你所愿,它非常灵活,支持社区很好!
答案 1 :(得分:-1)
在使用无服务器时,我们遇到了类似的问题,因为需要在AWS Lambdas之间共享代码。最初我们曾经在每个微服务中复制代码,但是后来一直很难管理。
由于在Windows环境中进行了开发,因此使用符号链接不是我们的选择。
然后我们提出了一个解决方案,使用共享文件夹来保持本地依赖关系,并使用自定义写入的gulp任务在每个微服务端点上复制这些依赖关系,以便可以像npm包那样需要依赖关系。 / p>
我们做出的决定之一是不要保留两个位置来定义微服务的依赖关系,因此我们使用相同的package.json来定义本地共享依赖关系,其中gulp任务传递此文件并相应地复制共享依赖关系使用单个命令安装npm依赖项。
稍后我们将代码开源为npm模块serverless-dependency-install和gulp-dependency-install。