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

如何通过构建脚本在Xcode编译时递归排除指定父目录文件

解决方案:用构建脚本动态排除指定父文件夹下的所有文件

当然可以!Xcode自带的Excluded Source File Names确实不支持递归排除子文件夹,手动维护文件列表又很麻烦。用构建脚本来动态扫描并排除指定目录下的所有文件,完美解决这个痛点——以后增删文件夹里的文件,完全不用改构建设置。

下面是具体的实现步骤:

步骤1:添加Run Script构建阶段

首先要在你的Target里新增一个Run Script,并且确保它在Compile Sources之前执行(这样才能在编译前修改排除列表):

  • 打开Xcode项目,选中你要配置的Target
  • 切换到「Build Phases」标签页
  • 点击左上角的「+」按钮,选择「New Run Script Phase」
  • 把这个新的Run Script拖到「Compile Sources」的上方

步骤2:编写动态排除脚本

把下面的脚本粘贴到Run Script的输入框里,然后根据你的项目需求修改参数:

# -------------------------- 配置参数 --------------------------
# 要排除的父文件夹路径(相对于项目根目录,支持多个,用空格分隔)
EXCLUDE_FOLDERS="DeprecatedModules LegacyCode/OldUtils"
# 要应用排除规则的编译配置(比如Debug、CustomTestConfig,多个用空格分隔)
TARGET_CONFIGS="Debug"
# 要排除的文件后缀(根据项目调整,比如.swift/.m/.h/.cpp等)
FILE_EXTENSIONS="*.swift *.m *.h"
# -------------------------------------------------------------

CURRENT_CONFIG="${CONFIGURATION}"

# 检查当前编译配置是否在目标列表中
if [[ " ${TARGET_CONFIGS} " == *" ${CURRENT_CONFIG} "* ]]; then
    EXCLUDED_FILES=""
    
    # 遍历所有要排除的文件夹
    for FOLDER in ${EXCLUDE_FOLDERS}; do
        FOLDER_PATH="${SRCROOT}/${FOLDER}"
        # 跳过不存在的文件夹,避免报错
        if [ ! -d "${FOLDER_PATH}" ]; then
            echo "Warning: Folder ${FOLDER_PATH} does not exist, skipping..."
            continue
        fi
        
        # 递归查找文件夹下符合后缀的文件,并转换为相对项目根目录的路径
        FOLDER_FILES=$(find "${FOLDER_PATH}" -type f \( $(printf "-o -name %s " ${FILE_EXTENSIONS}) \) | sed "s|${SRCROOT}/||")
        EXCLUDED_FILES="${EXCLUDED_FILES} ${FOLDER_FILES}"
    done
    
    # 更新Xcode的排除文件列表
    if [ -n "${EXCLUDED_FILES}" ]; then
        # 去重,避免重复添加同一文件
        EXCLUDED_FILES=$(echo "${EXCLUDED_FILES}" | tr ' ' '\n' | sort -u | tr '\n' ' ')
        EXCLUDED_SOURCE_FILE_NAMES="${EXCLUDED_SOURCE_FILE_NAMES} ${EXCLUDED_FILES}"
        echo "✅ Excluded files for ${CURRENT_CONFIG}: ${EXCLUDED_FILE_NAMES}"
    else
        echo "ℹ️ No files found to exclude for ${CURRENT_CONFIG}"
    fi
else
    echo "ℹ️ Skip exclusion: Current config ${CURRENT_CONFIG} is not in target list"
fi

脚本参数说明

  • EXCLUDE_FOLDERS:替换成你要排除的父文件夹路径,比如"Features/Unfinished",多个文件夹用空格分隔
  • TARGET_CONFIGS:设置你想要启用排除规则的编译配置,比如只在Debug环境排除就写"Debug",多个配置用空格分开
  • FILE_EXTENSIONS:指定要排除的文件类型,根据你的项目调整(比如OC项目可以只保留*.m *.h)

额外优化点

脚本里已经做了这些优化:

  • 跳过不存在的文件夹,避免报错
  • 自动去重,防止同一文件被多次添加到排除列表
  • 清晰的日志输出,方便你验证排除是否生效

验证是否生效

  1. 切换到目标编译配置(比如Debug)
  2. 按下Command+B编译项目
  3. 查看Build Log里的Run Script输出,会显示已排除的文件列表
  4. 也可以在编译后,去Target的「Build Settings」里搜索EXCLUDED_SOURCE_FILE_NAMES,确认排除的文件已经被添加进去(Xcode可能需要刷新才能显示)

这样以后你在目标文件夹里增删文件,脚本都会自动扫描并更新排除列表,完全不用手动修改构建设置啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:50:17