如何从具有依赖项的大型Monorepo到一个与Google App Engine相同的仓库中的程序包部署一个应用程序?

时间:2019-06-12 14:25:47

标签: node.js google-app-engine google-cloud-platform monorepo yarn-workspaces

我有一个大型的node.js monorepo,其中包含多个应用程序和程序包以及相互依赖性。全部由纱线工作区和一些lerna管理。一切对我来说都很好,但是我在尝试将此Monorepo中的应用程序之一部署到Google App Engine时遇到了麻烦。

主要问题是应用引擎想要安装仅位于本地且不在npm上的软件包,并且会引发错误。

我已经搜索了谷歌云文档,但没有找到我可以用来指定自定义节点程序包的任何东西或类似的东西。

有没有一种方法可以在不将本地软件包发布到npm的情况下进行这种部署?

我要部署的应用程序的基本结构如下:

weak

2 个答案:

答案 0 :(得分:0)

我在Firebase Cloud Functions中遇到相同的问题,因此我决定将程序包发布到私有注册表中,并使用.npmrc配置Cloud Function环境以使用我的私有注册表。我想您可以使用App Engine进行同样的操作。

对于私有注册表,我已经尝试了两个:GitHub Package Registry(现在处于Beta版)和Verdaccio(这是一个自托管选项)

答案 1 :(得分:0)

通过仅将deployable-appdeployable-app所依赖的同一仓库中的软件包(在您的情况下为packageA)中复制到镜像,以创建最小的docker映像。

安装时,yarn将完成所有工作以链接它们之间。

注意:

  • 确定性安装-建议在monorepos中强制执行确定性安装,因为nodejs packag emanagers(pnpm,yarn,npm)不会读取应用程序依赖项的锁定文件,因此在运行install时,并且packageA位于公共/私有npm-registry中,程序包管理器将根据需要安装packageA依赖项。但是,您的monorepo中有一个yarn.lock文件,其中描述了应正确安装的文件以及哪个版本。

  • 较小的docker映像,具有更好的缓存-仅从您的deployable-app需要的monorepo中复制本地软件包,并创建一个脚本,该脚本从monorepo中的所有package.jsons中删除所有devDependencies(在dockerfile中)。生产中不需要它们。缩小图像。