在部署中包含本地依赖关系到lambda

我有一个由几个“微服务”组成的回购,我上传到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 deploy取决于本地的任务
  • 本地任务将会:
    • npm build --production到一个目录
    • 然后将该目录pipe理到/local目录下的微服务
    • 清理共享中的安装
  • 然后我会引用所有的共享组件,如下所示:

     var sharedService = require('local/component-name-1'); 

希望这使得我想要实现的。 这个策略是否有意义? 有一个更简单的方法,我应该考虑? 有没有人有任何这样的事情的例子在“吞咽口水”?

我有一个答案! :d

TL; DR – 使用npm link进行链接,在您的公共组件和相关组件之间创build一个符号链接。

所以,我有一个只有两个模块的项目:

 - main-module - referenced-module 

每一个都是一个节点模块。 如果我进入referenced-module并运行npm link ,然后进入main-modulenpm link referenced-module ,npm将'我' referenced-module '安装'到我的main-module ,并将其存储在我的node_modules文件夹中。 注意:运行第二个npm link ,项目的名称是在package.jsonfind的名称,而不是目录的名称(请参阅先前链接的npm link文档)。

现在,在我的main-module我需要做的就是var test = require('referenced-module') ,我可以使用它来expression我心中的内容。 一定要module.exports您的代码从您的referenced-module

现在,当您将main-module压缩到部署到AWS Lambda时,链接将被parsing,并将真正的模块放置到位! 我已经testing了这个,它的工作,虽然不是与node-lambda ,但我不明白为什么这应该是一个问题(除非它做了一些不同的包恢复)。

这种方法的好处在于,我对referenced-module所做的任何更改都会在开发过程中由main-module自动提取,所以我不必运行任何吞吐任务或任何其他任务来同步它们。

我发现这是一个相当不错的,干净的解决scheme,我能够在几分钟内完成工作。 如果我上面描述的任何东西都没有任何意义(因为我只是自己发现了这个解决scheme!),请留下评论,我会尽力为您澄清。

更新2016年2月

根据您的要求和您的应用程序的大小,可能会有一个有趣的替代scheme比使用符号链接更加优雅地解决了这个问题。 看看无服务器 。 这是构build无服务器应用程序的一个很好的方法,并且包含有用的function,例如能够分配触发您正在编写的Lambda函数的API网关端点。 它甚至可以让你脚本CloudFormationconfiguration,所以如果你有其他资源部署,那么你可以这样做。 需要一个“testing”或“产品”阶段? 这也可以为你做。 我已经使用了一个多星期了,虽然有一些设置要做,事情并不总是那么清晰,但是它非常灵活,而且支持社区很好!

当使用无服务器时,我们遇到了类似的问题,当需要在AWS Lambdas之间共享代码时。 最初,我们曾经在每个微服务中重复使用代码,但后来一如往常,难以pipe理。

由于Windows环境下的开发,使用符号链接不是我们的select。

然后,我们想出了一个解决scheme,使用共享文件夹来保留本地依赖关系,并使用自定义编写的gulp任务将这些依赖关系复制到每个微服务端点,以便可以要求依赖项类似于npm包。

我们做的一个决定不是让两个地方定义微服务的依赖关系,所以我们使用相同的package.json来定义本地共享依赖关系,其中gulp任务传递这个文件并相应地复制共享依赖关系,同时安装npm依靠一个命令。

后来我们把代码开放源码作为npm模块serverless-dependency-install和gulp-dependency-install 。