React Native运行旧项目报env: sh\r: No such file or directory错误如何解决?
报错成因
- 该报错核心是换行符格式跨系统不兼容导致的:Windows系统默认文本换行格式为CRLF(即
\r\n),MacOS属于Unix类系统,默认仅使用LF(即\n)作为换行标识 - 旧项目是在Windows环境下开发,项目内的shell脚本(包括React Native内置构建脚本、自定义执行脚本、部分依赖包的可执行文件)保留了Windows的CRLF换行符,MacOS的shell解析时会把行尾的
\r识别为文件名的一部分,因此提示找不到sh\r这个可执行文件 - 新建项目无报错是因为MacOS环境下生成的文件默认使用LF换行符,不存在格式兼容问题
修复方案
临时修复当前项目
- 优先删除旧依赖目录重装,排除依赖包内脚本的换行问题:
rm -rf node_modules package-lock.json yarn.lock npm install # 若使用yarn则执行 yarn install
- 若重装依赖后仍报错,使用dos2unix工具批量转换项目脚本的换行格式:
- 首先安装dos2unix:
brew install dos2unix - 在项目根目录执行批量转换:
# 转换所有.sh后缀的shell脚本 find . -type f -name "*.sh" -exec dos2unix {} \; # 也可针对性转换原生构建目录的所有文件 find ./ios -type f -exec dos2unix {} \; find ./android -type f -exec dos2unix {} \; - 首先安装dos2unix:
全局配置避免后续同类问题
- 配置git自动处理换行符,拉取Windows环境提交的代码时自动将CRLF转为LF,提交时自动适配对应系统格式:
git config --global core.autocrlf input
- 可在项目根目录新增
.gitattributes文件,统一项目内的换行规则,避免跨系统协作时反复出现同类问题,参考配置:
*.sh text eol=lf
*.js text eol=lf
*.ts text eol=lf
*.json text eol=lf
*.gradle text eol=lf
*.pbxproj text eol=lf
内容的提问来源于stack exchange,提问作者Nicholas Lindartono
相关产品推荐
相关产品推荐

