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

如何在Xcode中为多个Target复用同一个Build Phase?

为多个Target复用SwiftLint Build Phase的实现方案

当然可以为多个Target复用Build Phase逻辑,下面是几种无需重复添加完整Build Phase的实用方案:

方案1:使用Aggregate Target

  • 新建一个Aggregate类型的Target(比如命名为SwiftLintGlobalRunner)
  • 给这个Aggregate Target添加Run Script Phase,写入SwiftLint的执行命令,比如:
    if which swiftlint >/dev/null; then
      swiftlint lint --path "${SRCROOT}"
    else
      echo "SwiftLint未安装,请先安装:brew install swiftlint"
    fi
    
  • 打开每个需要SwiftLint检查的Target的Build Phases面板,在Dependencies列表中添加这个Aggregate Target
  • 这样每次构建任意目标时,都会先执行Aggregate里的SwiftLint脚本,实现一次配置全局复用

方案2:复用外部脚本文件

  • 把SwiftLint的执行逻辑保存为单独的Shell脚本文件,比如Scripts/run-swiftlint.sh,并赋予执行权限:chmod +x Scripts/run-swiftlint.sh
  • 脚本内容示例:
    #!/bin/bash
    if which swiftlint >/dev/null; then
      swiftlint lint --path "${SRCROOT}/${TARGET_NAME}"
    else
      echo "SwiftLint未安装,请先安装:brew install swiftlint"
    fi
    
  • 给每个需要检查的Target添加一个极简的Run Script Phase,内容仅调用这个外部脚本:
    "${SRCROOT}/Scripts/run-swiftlint.sh"
    
  • 这种方式虽然每个Target都有Build Phase,但核心逻辑集中在一个文件里,修改时只需更新脚本文件即可,避免重复编写相同代码

方案3:使用Xcode预构建脚本(Xcode 13+)

  • 打开项目根目录的设置面板,切换到Pre-build Actions标签
  • 点击+添加一个Run Script,写入SwiftLint的执行命令
  • 这个脚本会在所有Target构建之前自动执行,无需给每个Target单独配置
  • 如果需要针对不同Target扫描特定路径,可以利用TARGET_NAME变量做判断:
    if which swiftlint >/dev/null; then
      case "${TARGET_NAME}" in
        TargetA|TargetB)
          swiftlint lint --path "${SRCROOT}/Targets/${TARGET_NAME}"
          ;;
        *)
          echo "跳过${TARGET_NAME}的SwiftLint检查"
          ;;
      esac
    else
      echo "SwiftLint未安装,请先安装:brew install swiftlint"
    fi
    

内容的提问来源于stack exchange,提问作者Iiro Alhonen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:45:19