如何在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
相关产品推荐
相关产品推荐

