使用EAS Build构建Expo项目时iOS和Android均报错求助
Expo EAS Build 双平台构建失败问题排查与解决
问题背景
使用EAS Build构建Expo React Native裸工程(bare workflow)时,双平台均构建失败:
- iOS报错:
spawn pod ENOENT - Android报错:
ENOENT: no such file or directory, open '/home/expo/workingdir/build/android/gradlew'
本地项目的ios、android目录文件完整,已执行expo prebuild、清理iOS Pods、修改Podfile,尝试过云构建和本地构建,问题仍未解决。环境信息:EAS CLI v15.0.15,Expo ~52.0.38。
疑问解答与解决方案
1. 本地已安装CocoaPods 1.16.2,为何iOS仍报该错误?
EAS Build在云端独立容器中执行构建,本地的CocoaPods环境完全不影响云端。报错原因通常是云端容器未正确初始化Pod环境,或构建配置中缺少Pod安装步骤。
- 解决:在eas.json的iOS构建配置中添加
prebuildCommand,确保云端执行预构建后自动安装Pods:
也可在package.json的scripts中添加"ios": { "prebuildCommand": "expo prebuild --clean && cd ios && pod install" }"pod-install": "cd ios && pod install",并在eas配置中调用该脚本。
2. Android目录存在gradlew,为何EAS Build无法找到?
核心原因是gradlew及相关gradle文件未被git追踪,导致上传到云端时缺失。
- 解决:
- 检查.gitignore文件,确保未排除
android/gradlew、android/gradlew.bat、android/gradle/目录; - 执行命令将文件加入git:
git add android/gradlew android/gradlew.bat android/gradle/ git commit -m "Add gradle wrapper files" - 若仍无效,删除android目录后重新执行
expo prebuild --clean,提交后再触发构建。
- 检查.gitignore文件,确保未排除
3. EAS CLI版本与eas.json配置是否存在版本不匹配?
EAS CLI v15与Expo SDK 52版本兼容,但部分eas.json中的旧字段可能已被废弃,导致构建异常。
- 解决:
- 检查eas.json中是否使用了已废弃的配置字段(如旧版
env格式); - 执行
eas build:configure命令,重新生成适配当前CLI版本的eas.json配置,覆盖原有配置后测试。
- 检查eas.json中是否使用了已废弃的配置字段(如旧版
4. bare workflow项目是否需要特定的eas.json配置?
是的,裸工程依赖原生目录配置,eas.json需明确指定预构建和构建步骤,确保云端生成正确的原生环境。
- 示例适配SDK 52的eas.json配置:
重点:必须包含{ "build": { "production": { "android": { "buildType": "app-bundle", "prebuildCommand": "expo prebuild --clean" }, "ios": { "buildType": "archive", "prebuildCommand": "expo prebuild --clean && cd ios && pod install" }, "env": { "EXPO_PUBLIC_API_URL": "https://api.example.com" } } } }prebuildCommand确保云端生成正确的原生目录;Android需保证gradlew可执行,iOS需确保Pod依赖安装完成。
5. 是否是构建上传时的权限或文件结构问题?
- 权限问题:
gradlew需要可执行权限,本地执行chmod +x android/gradlew后提交git,云端容器会保留该权限;iOS的Podfile若权限不足也可能导致无法执行pod命令,可执行chmod 644 ios/Podfile后提交。 - 文件结构问题:确保项目根目录结构正确,未移动过ios/android目录;检查app.json/expo.json中
ios.bundleIdentifier和android.package与原生目录中的配置一致;确认.gitignore未排除原生目录的必要文件(如android/app/src/main/、ios/Podfile.lock等)。
内容的提问来源于stack exchange,提问作者Batuhan Özkaner
相关产品推荐
相关产品推荐

