如何解决GAE部署报错Error Response [9]:React应用Cloud Build部署失败
该报错根因为fsevents是仅适配macOS系统的原生依赖包,Cloud Build及GAE的运行环境均为Linux系统,本不需要安装该依赖。出现报错是由于依赖链中的watchpack-chokidar2尝试拉取该可选依赖,或本地生成的依赖锁文件锁定了跨平台的可选依赖规则导致,可按以下步骤解决:
修改npm安装命令跳过可选依赖
在
cloudbuild.yaml的npm install步骤添加--no-optional参数,直接跳过所有可选依赖的安装,fsevents属于watchpack的可选依赖,跳过不会影响Linux环境下的构建运行。修改后的构建步骤参考:steps: - name: node entrypoint: npm args: ['install', '--no-optional'] - name: node entrypoint: npm args: ['run','build'] - name: 'gcr.io/cloud-builders/gcloud' args: ['app', 'deploy'] timeout: 1200s timeout: 1200s新增.npmrc配置强制忽略fsevents
若修改安装命令后仍报错,可在项目根目录新建
.npmrc文件(已存在则直接编辑),添加如下配置强制npm忽略fsevents包的安装,修改后将.npmrc提交到代码仓库即可:fsevents=false清理跨平台生成的依赖锁文件
若本地是macOS环境生成的
package-lock.json或yarn.lock,会将fsevents的依赖信息锁定到文件中,导致Linux环境安装时尝试拉取对应包。可先删除本地的锁文件,由Cloud Build构建时自动生成适配Linux环境的依赖树,或在本地执行npm install --no-optional重新生成锁文件后再提交代码。统一构建与运行环境的Node版本
当前
app.yaml指定的runtime为nodejs14,需确认Cloud Build使用的node镜像版本与runtime版本一致,避免跨版本依赖解析差异,可将构建步骤的node镜像明确指定为对应大版本:
将- name: node修改为- name: node:14,保证构建环境和线上运行环境的Node版本完全匹配。
内容的提问来源于stack exchange,提问作者Ron Portnoy

