我有一个由几个“微服务”组成的存储库,我将其上载到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任务
  • local-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-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-module所做的任何更改都会自动由我的main-module接受,因此我不必运行任何gulp任务或任何同步它们的任务。

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

    2016年2月更新

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

    10-07 19:49
    查看更多