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

Turborepo monorepo构建Expo app遇metro模块找不到错误求助

解决Turborepo Monorepo中npx expo run:ios找不到metro/src/lib/TerminalReporter的问题

问题场景

在Turborepo monorepo环境下执行npx expo run:ios构建Expo应用时,出现以下错误:

Error: Cannot find module 'metro/src/lib/TerminalReporter'
Require stack:
- @expo/cli/build/src/start/server/metro/TerminalReporter.js
- @expo/cli/build/src/start/server/metro/MetroTerminalReporter.js
- @expo/cli/build/src/start/server/metro/instantiateMetro.js
- @expo/cli/build/src/start/server/metro/MetroBundlerDevServer.js
- @expo/cli/build/src/start/server/DevServerManager.js
- @expo/cli/build/src/run/startBundler.js
- @expo/cli/build/src/run/ios/runIosAsync.js
- @expo/cli/build/src/run/ios/index.js
- @expo/cli/build/bin/cli
- expo/bin/cli

该错误仅出现在monorepo内的项目中,标准Expo仓库(非monorepo)执行npx expo run:ios可正常运行,且monorepo环境下执行npx expo start --ios也无异常。已完成Expo Monorepo指南中的配置,删除并重装node_modules后问题仍未解决。

解决方案

1. 锁定Metro相关依赖版本

monorepo中依赖版本不一致是常见诱因,将项目的Metro相关包版本锁定为与正常运行的非monorepo项目一致:
在项目的package.json的devDependencies中添加或指定版本:

"devDependencies": {
  "metro": "^0.76.0",
  "metro-core": "^0.76.0",
  "metro-react-native-babel-transformer": "^0.76.0"
}

执行依赖安装命令:

npm install
# 或 yarn install

2. 调整Metro配置确保模块解析正确

修改项目根目录的metro.config.js,配置resolver路径优先使用项目本地依赖:

const { getDefaultConfig } = require('expo/metro-config');
const path = require('path');

const config = getDefaultConfig(__dirname);

// 添加本地及monorepo根目录的node_modules路径(根据你的monorepo结构调整层级)
config.resolver.nodeModulesPaths = [
  path.resolve(__dirname, 'node_modules'),
  path.resolve(__dirname, '../../node_modules')
];

// 禁用依赖层级查找,强制使用项目本地的Metro版本
config.resolver.disableHierarchicalLookup = true;

module.exports = config;

3. 用Expo命令修复依赖不匹配

执行Expo官方的依赖修复命令,自动调整兼容版本:

npx expo install --fix

4. 调整Turborepo缓存配置

在monorepo根目录的turbo.json中,确保run:ios任务不缓存依赖相关内容,且依赖前置安装任务:

{
  "pipeline": {
    "run:ios": {
      "dependsOn": ["^install"],
      "outputs": []
    }
  }
}

问题原因

monorepo的依赖扁平化机制可能导致Expo CLI加载了不兼容的Metro版本,或模块路径解析错误。npx expo start --ios与npx expo run:ios使用的Metro初始化逻辑不同,前者能规避路径问题,后者则触发了模块查找失败。

内容的提问来源于stack exchange,提问作者Adam Sucharda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:03:24