如何在Fastlane构建时禁用Xcode指定Build Phase脚本
Fastlane构建时自动跳过Xcode内置SwiftLint Run Script的实现方案
优先用环境变量判断的方案,无额外依赖,不影响本地开发体验,从根源解决重复Lint问题:
- 首先修改Xcode中配置的SwiftLint Run Script,在脚本最开头增加环境变量判断逻辑,检测到Fastlane CI构建标记时直接退出,不执行后续Lint逻辑:
# Fastlane构建时跳过内置Lint流程 if [[ -n "$FASTLANE_CI_BUILD" ]]; then echo "Skip Xcode embedded SwiftLint, use Fastlane lint lane result" exit 0 fi # 保留原有SwiftLint执行逻辑 if which swiftlint >/dev/null; then swiftlint else echo "warning: SwiftLint not installed, please run `brew install swiftlint` first" fi
- 然后在Fastlane的构建相关Lane中,执行构建命令前注入对应环境变量即可:
lane :build_ipa do # 注入标记,通知Xcode跳过内置SwiftLint脚本 ENV["FASTLANE_CI_BUILD"] = "1" build_app( # 此处保留你原有的构建配置参数即可 workspace: "YourApp.xcworkspace", scheme: "YourAppScheme", configuration: "Release" ) end
这个方案的优势:
- 本地开发者正常打开Xcode构建时,不存在
FASTLANE_CI_BUILD环境变量,内置的SwiftLint脚本会正常执行,完全不影响本地开发的Lint自动检查能力 - Fastlane执行独立的SwiftLint Lane时,不会触发Xcode构建流程,自然不会重复执行Lint;执行构建Lane时因为注入了环境变量,会自动跳过内置Lint步骤,不会出现重复执行的问题
- CI流水线中可以单独调度Lint Lane作为质量卡点,Lint失败的节点会单独标记,不会和构建流程的报错混在一起,符合流水线设计需求
如果不想修改Xcode内的Run Script内容,可以用xcodeproj工具在构建前临时禁用对应脚本阶段,构建结束后自动恢复,但这个方案稳定性较差,CI执行中断时可能残留项目配置修改,不推荐优先使用,参考实现如下:
require 'xcodeproj' lane :build_ipa do project = Xcodeproj::Project.open("YourApp.xcodeproj") target = project.targets.find { |t| t.name == "YourMainTarget" } # 匹配你自己写的SwiftLint脚本关键字 lint_phase = target.shell_script_build_phases.find { |p| p.shell_script.include?("swiftlint") } original_status = lint_phase.run_as_for_installs? lint_phase.run_as_for_installs = false begin build_app( # 原有构建配置 ) ensure # 无论构建成功失败,都恢复原有脚本配置 lint_phase.run_as_for_installs = original_status project.save end end
注意:该方案会临时修改
.pbxproj项目配置文件,使用前必须确保CI工作区每次构建都是干净拉取的状态,避免配置残留影响后续构建。
内容的提问来源于stack exchange,提问作者Wouter
相关产品推荐
相关产品推荐

