Windows下React Native构建报错:EMFILE: too many open files
React Native 0.74.6 Windows Release构建EMFILE文件过多问题修复
问题概述
Windows环境下构建Bare React Native 0.74.6项目时,执行命令:
npx react-native build-android --mode=debug --tasks assembleRelease
构建失败,核心报错:
error EMFILE: too many open files, open 'C:\Users\hk\AppData\Local\Temp\metro-cache\...'
关联任务执行失败日志:
Execution failed for task ':app:createBundleReleaseJsAndAssets'. > Process 'command 'cmd'' finished with non-zero exit value 1
已知观察结果:
- Mac环境同命令可成功构建
- Windows与Mac配置一致,本地其他同类RN项目正常构建
- 回滚至两周前提交可正常构建,问题与近期包更新相关
- Debug构建在Windows和Mac均正常
根因分析
问题源于Metro缓存模块在执行createBundleReleaseJsAndAssets任务时打开文件数超出Windows系统默认文件句柄限制,大概率是近期新增/升级的依赖包引入了大量需要缓存的文件,或是依赖包的缓存逻辑存在Windows兼容性问题。
修复步骤
1. 彻底清理缓存
先清除Metro缓存和Android构建缓存,排除旧缓存堆积问题:
# 重置Metro缓存 npx react-native start --reset-cache # 删除Android构建目录 rmdir /s /q android\app\build rmdir /s /q android\build # 重新执行构建命令 npx react-native build-android --mode=debug --tasks assembleRelease
2. 定位问题依赖包
对比回滚提交与当前提交的package.json,找出近期新增或升级的依赖包,逐个临时移除并重新构建,定位触发问题的包:
- 移除单个依赖:
npm uninstall [package-name] - 测试构建,若恢复正常,说明该包是问题源
- 针对问题包:
- 查看包文档是否有Windows环境特殊配置要求
- 暂时降级至回滚提交中的版本(
npm install [package-name]@[old-version]) - 向包作者提交Windows兼容性问题
3. 调整Windows文件句柄限制(临时 workaround)
若暂时无法定位到依赖包,可临时提升Windows文件句柄上限:
- 以管理员身份打开PowerShell
- 执行以下命令修改注册表:
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters -Name MaxOpenFiles -Value 65536 -Type DWord - 重启电脑后重新构建
4. 优化Metro缓存配置
修改metro.config.js,调整缓存存储位置和大小,减少临时文件堆积:
const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); const path = require('path'); const customConfig = { cacheStores: [ new (require('metro-cache').FileStore)({ // 将缓存移至项目本地node_modules目录下,避免系统临时目录权限/数量限制 root: path.join(__dirname, 'node_modules/.cache/metro'), // 限制缓存最大大小为100MB,超出自动清理 maxSize: 1024 * 1024 * 100, }), ], }; module.exports = mergeConfig(getDefaultConfig(__dirname), customConfig);
5. 检查Release构建特殊配置
对比Debug与Release模式的Metro参数,排查是否Release模式下启用了额外的文件扫描或缓存逻辑:
- 打开
android/app/build.gradle,查看createBundleReleaseJsAndAssets任务是否添加了特殊参数 - 确认是否在
metro.config.js中针对Release模式设置了不同的watchFolders或resolver配置
内容的提问来源于stack exchange,提问作者hkrobotics
相关产品推荐
相关产品推荐

