You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Google App Engine上运行NestJS Monorepo?部署报错解决

解决NestJS Monorepo部署Google App Engine(GAE)的依赖读取问题

问题根源

你把app.yaml和cloudbuild.json放在了apps/my-app目录下,Cloud Build默认会将该目录作为构建上下文,导致根目录的package.json不在这个上下文范围内,所以报错找不到/workspace/package.json。

解决方案

1. 调整文件结构

把cloudbuild.json从apps/my-app移到项目根目录,app.yaml保留在apps/my-app(符合GAE要求:app.yaml需与服务源码同层级)。调整后结构如下:

apps
    my-app
        src
            ...
            app.yaml
    my-project
        src
            ...
nest-cli.json
package.json
tsconfig.json
cloudbuild.json  // 移到根目录
.gcloudignore    // 新增,可选但推荐

2. 配置根目录的cloudbuild.json

通过构建步骤指定在根目录执行依赖安装、构建指定应用,再部署目标服务:

{
  "steps": [
    {
      "name": "node:20",
      "args": ["npm", "install"],
      "dir": "."  // 在根目录执行npm install,访问根目录的package.json
    },
    {
      "name": "node:20",
      "args": ["npm", "run", "build", "my-app"],  // 仅构建my-app应用
      "dir": "."
    },
    {
      "name": "gcr.io/google.com/cloudsdktool/cloud-sdk",
      "args": ["app", "deploy", "apps/my-app/app.yaml"],
      "dir": "."
    }
  ]
}

3. 配置apps/my-app/app.yaml

指定Node.js运行时和构建后的启动路径(NestJS monorepo构建产物默认在dist/apps/my-app):

runtime: nodejs20
service: my-app  // 指定服务名,默认服务可省略

entrypoint: node dist/apps/my-app/main.js

# 可选:设置环境变量
env_variables:
  NODE_ENV: "production"

4. 新增.gcloudignore(推荐)

避免上传不必要的文件,减少构建时间:

node_modules/
dist/
.git/
*.log
apps/my-project/  // 排除不需要部署的其他应用目录

部署验证

执行Cloud Build部署命令(在根目录运行):

gcloud builds submit --config cloudbuild.json .

也可以直接通过GCP控制台关联Cloud Build触发器,触发自动构建部署。

内容的提问来源于stack exchange,提问作者Eden WebStudio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:50:45