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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:54:21