如何在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
相关产品推荐
相关产品推荐

