17

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

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

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

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

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

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

2 回答 2

1

通过仅处理图像和来自依赖deployable-app的同一个 monorepo 的包来创建一个最小的 docker 图像(在你的情况下它是)。deployable-apppackageA

安装时,yarn 会做所有的工作来连接它们。

笔记:

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

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

于 2020-10-23T15:44:38.693 回答
0

我对 Firebase Cloud Functions 也有同样的问题,所以我决定将我的包发布到私有注册表中,并使用 .npmrc 配置 Cloud Function 环境以使用我的私有注册表。我想你可以对 App Engine 做同样的事情。

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

于 2019-10-09T13:21:28.813 回答