如何将一个应用程序从具有依赖项的大型单存储库部署到同一存储库中的包到 google 应用程序引擎?



我有一个大的节点.js monorepo,其中包含多个应用程序和包以及相互依赖关系。这一切都是通过纱线工作区和一点点lerna来管理的。一切对我来说都很好,但是我在尝试将此 monorepo 中的一个应用程序部署到谷歌应用程序引擎时遇到麻烦。

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

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

有没有办法在不将本地包发布到 npm 的情况下进行这样的部署?

我要部署的应用的基本结构如下所示:

-root
-packages
-packageA
-package.json
-apps
-deployable-app
-package.json <-contains dependency: "packageA": "0.0.1"
-app.yaml

通过仅将deployable-app和来自deployable-app所依赖的同一 monorepo 的包复制到映像来创建最小的 docker 映像(在您的情况下是packageA)。

安装时,纱线将完成所有工作以连接它们。

笔记:

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

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

我在使用Firebase Cloud Functions时遇到了同样的问题,因此我决定将我的软件包发布到私有注册表中,并使用.npmrc配置Cloud Function环境以使用我的私有注册表。我想你可以用App Engine做同样的事情。

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

最新更新