包括部署到lambda的本地依赖项

ken*_*ken 6 node.js npm gulp aws-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
Run Code Online (Sandbox Code Playgroud)

基本部署利用了方便的node-lambdanpm模块,但当我使用如下语句引用本地共享组件时:

var sharedService = require('../../shared-component-1/dist/index');
Run Code Online (Sandbox Code Playgroud)

这适用于node-lambda run命令,但node-lambda deploy删除了本地依赖项.可能是有道理的,因为我要在我的依赖项中的"根"目录下面,所以我想也许我会利用gulp来完成这项工作,但我对它很新,所以我可能会做一些愚蠢的事情.我的策略是:

  • 曾经gulp deploy依赖于本地DEPS任务
  • 本地DEPS任务是:
    • npm build --production 到一个目录
    • 然后通过管道这个目录切换到下微服务/local目录
    • 清理共享中的安装
  • 然后我会引用所有共享组件,如下所示:

    var sharedService = require('local/component-name-1');
    
    Run Code Online (Sandbox Code Playgroud)

希望这能成为我想要实现的目标.这种策略有意义吗?我应该考虑更简单的方法吗?在"gulp speak"中有没有人有这样的例子?

Chr*_*ton 5

我对此有一个答案!:D

TL; DR-用于npm link链接在您的公共组件和从属组件之间创建符号链接。

因此,我有一个只有两个模块的项目:

- main-module
- referenced-module
Run Code Online (Sandbox Code Playgroud)

这些都是节点模块。如果我cd进入referenced-module并运行npm link,然后cd进入main-modulenpm 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-modulemain-module在开发过程中对我所做的任何更改都会自动被我拾取,因此我不必运行任何gulp任务或任何同步它们的任务。

我发现这是一个很好的,干净的解决方案,我能够在几分钟内使它工作。如果上述内容没有任何意义(因为我自己才发现此解决方案!),请发表评论,我会尽力为您澄清。

2016年2月更新

根据您的要求和您的应用程序的大小,可能有一个有趣的替代方法,它比使用符号链接更优雅地解决此问题。看看Serverless。这是构造无服务器应用程序的一种很巧妙的方法,并且包括有用的功能,例如能够分配API Gateway端点来触发您正在编写的Lambda函数。它甚至允许您编写CloudFormation配置的脚本,因此,如果您有其他资源要部署,则可以在此处进行。需要一个“ beta”或“ prod”阶段?这也可以为您做。我已经使用了一个多星期,尽管需要进行一些设置,而且事情并不总是如您所愿,但是它非常灵活,并且支持社区很好!