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

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子目录:
    eas build --platform ios --local --workspace app1
    
    或通过npm workspace调用:
    npm 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:35:01