如何从一个包含依赖关系的大型monorepo中部署一个应用程序到Google App Engine?该monorepo中还包含其他的包。

22

我有一个包含多个应用程序和包以及相互依赖的大型node.js monorepo。它全部由yarn workspaces和一点点lerna管理。对于我来说一切都很好,但是我正在尝试将monorepo中的一个应用程序部署到Google App Engine时遇到了麻烦。

主要问题是App Engine希望安装仅位于本地且不在npm上的软件包,并抛出错误。

我搜寻了谷歌云文档,但没有找到能够指定自定义节点包或类似内容的任何东西。

是否有办法在不将本地软件包发布到npm的情况下进行此类部署?

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

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

1
刚遇到了这个问题。我的解决方案是使用私有注册表。 - David W. Keith
@DavidW.Keith 那是什么意思呢?“使用私有注册表”? - mesqueeb
在NPMJS上执行此操作的文档在此处:https://docs.npmjs.com/creating-and-publishing-private-packages 您也可以托管自己的包,但它需要在公共可访问(但已安全)的服务器上。 - David W. Keith
1
是的,我并没有真正解决它,最终转移到了GKE。 - Algirdyz
2个回答

2
通过将可部署应用程序和同一 monorepo 中的 deployable-app 依赖的包复制到镜像中,创建一个最小的 Docker 镜像(在您的情况下是 packageA)。安装时,yarn 将完成所有链接工作。注意事项:1. 确定性安装-建议在monorepos中这样做,以强制确定性安装,因为nodejs包管理器(pnpm、yarn、npm)不会读取您的应用程序依赖项的锁文件,所以当您运行install时,如果packageA位于公共/私有npm-registry中,包管理器将按照他想要的方式安装packageA依赖项。但是,在您的monorepo中有一个描述应该安装什么以及哪个版本的yarn.lock文件。2. 小型docker镜像,更好的缓存-只复制您的monorepo中本地软件包需要的内容,并创建一个脚本,从monorepo中所有package.json中删除所有devDependencies(在dockerfile内部)。它们在生产中不需要。让您的镜像变得更小。

1

我在使用Firebase Cloud Functions时遇到了同样的问题,所以我决定将我的包发布到私有注册表中,并使用.npmrc配置Cloud Function环境来使用我的私有注册表。我想你也可以用同样的方法来处理App Engine。

至于私有注册表,我已经尝试过两种:GitHub Package Registry(目前处于Beta版)和Verdaccio(这是一种自托管的选项)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接