Skip to content

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阶段
  • 可能导致项目无法编译运行或无法归档应用
  • 截图示例如下: Xcode截图

全面解决方案

方法1:修复CocoaPods脚本问题(首选方案)

此问题最常见的根源是CocoaPods生成的脚本文件在Xcode 14+中存在兼容性问题:

  1. 在项目中定位文件:
    ios/Pods/Target Support Files/Pods-{YourProjectName}/Pods-{YourProjectName}-frameworks.sh

  2. 找到代码段:

    shell
    if [ -L "${source}" ]; then
      echo "Symlinked..."
      source="$(readlink "${source}")"
    fi
  3. 修改为:

    shell
    if [ -L "${source}" ]; then
      echo "Symlinked..."
      source="$(readlink -f "${source}")"  # 添加 -f 参数
    fi

    注意

    每次执行pod install后都需要重新修改此文件

  4. (可选)永久修复方案 - 在Podfile中添加后处理脚本:

    ruby
    post_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
  5. 完整清理重建:

    bash
    pod deintegrate
    pod repo update
    pod install

方法2:更新CocoaPods和相关工具

bash
# 更新CocoaPods到最新版本(推荐≥1.12.1)
sudo gem install cocoapods

# Flutter项目需更新到稳定版本(≥3.7.10)
flutter upgrade

# 清理缓存后重建
rm -rf ios/Pods ios/Podfile.lock
pod install
bash
sudo gem install cocoapods
pod repo update
bash
flutter clean
rm -rf ios/Podfile.lock ios/Pods

方法3:调整部署目标和构建设置

  1. 设置iOS最低部署目标(所有Targets)

    • Runner → TARGETS → Build Settings → iOS Deployment Target → 设为12.0
    • Pods → PROJECT → Build Settings → iOS Deployment Target → 设为12.0
  2. 配置Flutter最低版本(如适用):

    • ios/Podfile开头添加:
      ruby
      platform :ios, '12.0'
  3. 检查配置继承(Xcode 15+常见问题):

    • Runner → PROJECT → Configurations → Based on Configuration
    • 确保各配置使用标准值:
      • Debug → Debug
      • Release → Release
      • Profile → Release

方法4:针对特定框架的解决方案

处理Firebase错误

shell
# 原错误:Pods/FirebaseCrashlytics/upload-symbols: No such file
# 解决方案:更新Run Script路径
"${BUILD_DIR%/Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run"

React Native修复方案

  1. 打开文件:
    node_modules/react-native/scripts/find-node.sh

  2. 修改第7行:

    diff
    - set -e
    + set +e  # 禁用错误即退出模式

方法5:清理和空间管理

重要提示

当MAC磁盘空间不足时可能触发此错误

  1. 清理Xcode缓存:

    bash
    rm -rf ~/Library/Developer/Xcode/DerivedData
  2. 检查存储空间:

    bash
    df -h # 确保>10GB可用空间

高级疑难排错

Apple Silicon设备特殊处理

M系列芯片的额外步骤
bash
# 安装Rosetta支持
sudo softwareupdate --install-rosetta --agree-to-license

# 在Finder中右键点击Xcode→显示简介→勾选“使用Rosetta打开”

React Native项目检查

  1. 检查.xcode.env.local文件是否存在多余配置
  2. 验证所有依赖是否完全移除:
    javascript
    // App.js中删除所有未使用的import
  3. 执行完整清理:
    bash
    watchman watch-del-all
    rm -rf node_modules
    npm install

脚本执行选项调整

在Xcode中:

  1. 进入TARGETS → Build Phases → Run Script
  2. 勾选For install builds only选项: 设置截图

预防措施

  1. 定期更新工具链

    • 保持Xcode在最新稳定版本
    • 每季度更新CocoaPods:sudo gem update cocoapods
  2. 项目设置标准化

    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控制台输出的完整错误日志,通常包含具体失败脚本的行号信息。