Monorepo中使用EAS Build构建iOS应用启动报错求助
Monorepo下Expo iOS本地构建原生模块缺失问题解决
核心原因
Expo Go运行正常但本地构建后出现原生模块找不到,本质是Monorepo结构下依赖解析或构建配置未正确关联原生模块,导致构建产物未包含所需的原生代码。
具体解决步骤
1. 调整依赖安装与工作区调用方式
- 确保需要原生支持的依赖(如
react-native-safe-area-context、expo-av、expo-secure-store、@react-native-async-storage/async-storage、react-native-reanimated)要么直接安装在app1的package.json中,要么根目录的依赖通过npm workspace正确hoist。 - 从根目录执行构建命令,而非app1子目录:
或通过npm workspace调用:eas build --platform ios --local --workspace app1npm exec --workspace app1 eas build --platform ios --local
2. 配置EAS Build工作区参数
在apps/app1/eas.json的构建配置中添加工作区环境变量,明确指定构建目标:
{ "build": { "development": { "developmentClient": true, "ios": { "local": true }, "env": { "EXPO_WORKSPACE": "app1" } } } }
3. 修复Metro依赖解析配置
在apps/app1/metro.config.js中添加Monorepo路径解析支持,确保Metro能找到根目录的依赖:
const { getDefaultConfig } = require('expo/metro-config'); const path = require('path'); const config = getDefaultConfig(__dirname); // 添加根目录node_modules到解析路径 config.resolver.nodeModulesPaths = [ path.resolve(__dirname, 'node_modules'), path.resolve(__dirname, '../../node_modules'), ]; // 启用symlink支持(Monorepo必备) config.resolver.unstable_enableSymlinks = true; module.exports = config;
4. 清理构建缓存
缓存残留会导致配置不生效,执行以下操作:
- 删除
apps/app1/.expo目录 - 删除
apps/app1/ios目录(由Expo自动生成,删除后会重新生成) - 执行清理构建命令:
eas build --platform ios --local --clean --workspace app1
5. 验证Pod依赖配置
本地构建生成ios目录后,检查ios/Podfile是否包含所需原生模块的引用(如pod 'RNCSafeAreaContext'、pod 'ExpoAV'等)。若缺失,在app1目录执行:
npx pod-install
完成后重新构建。
6. 统一依赖版本
检查根目录与app1的package.json中,react-native、expo及相关原生模块的版本是否一致,避免版本冲突导致原生链接失败。
内容的提问来源于stack exchange,提问作者Aniketos
相关产品推荐
相关产品推荐

