我有一个普通的 Nestjs monorepo,但无法在 Google App Engine 上运行。我们首先必须在 GAE 上部署默认服务,我尝试通过在 monorepo 中获取默认嵌套应用程序 (my-app) 并添加我的 app.yaml 配置和 cloudbuild.json 配置文件来实现这一点。该项目如下所示:
apps
my-app
src
app.controller.ts
app.module.ts
app.service.ts
main.ts
tsconfig.app.json
app.yaml // GCP config file
clouldbuild.json // GCP config file
my-project
src
app.controller.ts
app.module.ts
app.service.ts
main.ts
tsconfig.app.json
nest-cli.json
package.json
tsconfig.json
node_modules
我部署到 GAE 时遇到的错误是:
no such file or directory, open '/workspace/package.json'
我猜这是因为 package.json 与 app.yaml 不在同一级别。然而,由于这是一个 monorepo,并且 package.json 在应用程序之间共享,我应该如何配置 GAE 和 Cloud Build 以从根文件夹读取 package.json,但仅在 app.yaml 中部署服务?根据 gcp 文档,app.yaml 必须与源文件处于同一级别。 GCP 文档 链接
由于 monorepo 的结构,在 Google App Engine (GAE) 上运行 NestJS monorepo 可能会有点棘手。 Google App Engine 期望 app.yaml 文件与应用程序的源文件位于同一目录中,这会在您使用 monorepos 时导致问题。您可以使用配置组合在 monorepo 中部署特定服务。
项目结构: 使用 monorepo 中每个 NestJS 应用程序的目录来组织您的项目。
我的monorepo |-- 应用程序 | |-- 我的应用程序 | |-- 源代码 | | |-- ... | |-- app.yaml |-- 我的项目 | |-- 源代码 | |-- ... |-- Nest-cli.json |-- 包.json |-- tsconfig.json |-- cloudbuild.yaml |-- 节点模块
云构建配置: 将 cloudbuild.yaml 文件放在 monorepo 的根目录下:
步骤:
此配置指示 Cloud Build 为每个应用安装依赖项并构建 TypeScript,确保其位于统一构建过程的根目录。
App.yaml: 在服务目录(apps/my-app/ 和 apps/my-project/)中的每个 app.yaml 文件中,包括:
运行时:nodejs16
处理者:
Package.json 脚本: 在 package.json 中,添加一个脚本以在启动应用程序之前复制必要的文件:
“脚本”:{ "start": "npm run copy-files && node dist/main.js", “复制文件”:“cp ../../package.json ../../tsconfig.json ../../node_modules ./” }
部署: 单独部署每个服务:
gcloud 应用程序部署 apps/my-app/app.yaml
gcloud 应用程序部署 apps/my-project/app.yaml
通过遵循此结构,您可以将 cloudbuild.yaml 文件保留在根目录中以进行集中式构建配置,从而简化了 Google App Engine 上的 NestJS monorepo 部署。根据您的具体设置需要进行调整。