Xcode中“Command PhaseScriptExecution failed with a nonzero exit code”错误解决方案
问题描述
当您在升级到Xcode 14或更高版本后,可能会遇到Command PhaseScriptExecution failed with a nonzero exit code
错误(中文显示为:"命令 PhaseScriptExecution 执行失败,退出代码非零")。这是一个通用错误提示,通常发生在构建过程中的脚本执行阶段。
典型特征
- 常见于Xcode 14+升级后,尤其在基于CocoaPods管理的项目中
- 错误信息通常出现在构建日志的
Run Script
阶段 - 可能导致项目无法编译运行或无法归档应用
- 截图示例如下:
全面解决方案
方法1:修复CocoaPods脚本问题(首选方案)
此问题最常见的根源是CocoaPods生成的脚本文件在Xcode 14+中存在兼容性问题:
在项目中定位文件:
ios/Pods/Target Support Files/Pods-{YourProjectName}/Pods-{YourProjectName}-frameworks.sh
找到代码段:
shellif [ -L "${source}" ]; then echo "Symlinked..." source="$(readlink "${source}")" fi
修改为:
shellif [ -L "${source}" ]; then echo "Symlinked..." source="$(readlink -f "${source}")" # 添加 -f 参数 fi
注意
每次执行
pod install
后都需要重新修改此文件(可选)永久修复方案 - 在Podfile中添加后处理脚本:
rubypost_install do |installer| installer.pods_project.targets.each do |target| # 原始配置保留 flutter_additional_ios_build_settings(target) # Flutter项目才需要 end # 自动修复所有部署目标 installer.generated_projects.each do |project| project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0' end end end end
完整清理重建:
bashpod deintegrate pod repo update pod install
方法2:更新CocoaPods和相关工具
# 更新CocoaPods到最新版本(推荐≥1.12.1)
sudo gem install cocoapods
# Flutter项目需更新到稳定版本(≥3.7.10)
flutter upgrade
# 清理缓存后重建
rm -rf ios/Pods ios/Podfile.lock
pod install
sudo gem install cocoapods
pod repo update
flutter clean
rm -rf ios/Podfile.lock ios/Pods
方法3:调整部署目标和构建设置
设置iOS最低部署目标(所有Targets)
- Runner → TARGETS → Build Settings → iOS Deployment Target → 设为
12.0
- Pods → PROJECT → Build Settings → iOS Deployment Target → 设为
12.0
- Runner → TARGETS → Build Settings → iOS Deployment Target → 设为
配置Flutter最低版本(如适用):
- 在
ios/Podfile
开头添加:rubyplatform :ios, '12.0'
- 在
检查配置继承(Xcode 15+常见问题):
- Runner → PROJECT → Configurations → Based on Configuration
- 确保各配置使用标准值:
- Debug → Debug
- Release → Release
- Profile → Release
方法4:针对特定框架的解决方案
处理Firebase错误
# 原错误:Pods/FirebaseCrashlytics/upload-symbols: No such file
# 解决方案:更新Run Script路径
"${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run"
React Native修复方案
打开文件:
node_modules/react-native/scripts/find-node.sh
修改第7行:
diff- set -e + set +e # 禁用错误即退出模式
方法5:清理和空间管理
重要提示
当MAC磁盘空间不足时可能触发此错误
清理Xcode缓存:
bashrm -rf ~/Library/Developer/Xcode/DerivedData
检查存储空间:
bashdf -h # 确保>10GB可用空间
高级疑难排错
Apple Silicon设备特殊处理
M系列芯片的额外步骤
# 安装Rosetta支持
sudo softwareupdate --install-rosetta --agree-to-license
# 在Finder中右键点击Xcode→显示简介→勾选“使用Rosetta打开”
React Native项目检查
- 检查
.xcode.env.local
文件是否存在多余配置 - 验证所有依赖是否完全移除:javascript
// App.js中删除所有未使用的import
- 执行完整清理:bash
watchman watch-del-all rm -rf node_modules npm install
脚本执行选项调整
在Xcode中:
- 进入TARGETS → Build Phases → Run Script
- 勾选For install builds only选项:
预防措施
定期更新工具链:
- 保持Xcode在最新稳定版本
- 每季度更新CocoaPods:
sudo gem update cocoapods
项目设置标准化:
ruby# 明确定义平台版本 platform :ios, '12.0' # 添加版本锁定 pod 'Alamofire', '~> 5.6' # 包含修复脚本 post_install do |installer| installer.generated_projects.each do |project| project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0' end end end end
::: success 实践要点
- 优先尝试脚本修补(方法1)和CocoaPods更新(方法2)
- 跨平台项目需同步设置部署目标
- 磁盘空间不足常被忽视但易修复
- 苹果芯片设备需要Rosetta支持 :::
通过综合应用这些解决方案,95%以上的PhaseScriptExecution错误可被有效解决。如问题持续,建议检查Xcode控制台输出的完整错误日志,通常包含具体失败脚本的行号信息。