如何通过构建脚本在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)
额外优化点
脚本里已经做了这些优化:
- 跳过不存在的文件夹,避免报错
- 自动去重,防止同一文件被多次添加到排除列表
- 清晰的日志输出,方便你验证排除是否生效
验证是否生效
- 切换到目标编译配置(比如Debug)
- 按下
Command+B编译项目 - 查看Build Log里的Run Script输出,会显示已排除的文件列表
- 也可以在编译后,去Target的「Build Settings」里搜索
EXCLUDED_SOURCE_FILE_NAMES,确认排除的文件已经被添加进去(Xcode可能需要刷新才能显示)
这样以后你在目标文件夹里增删文件,脚本都会自动扫描并更新排除列表,完全不用手动修改构建设置啦!
内容的提问来源于stack exchange,提问作者srus2017
相关产品推荐
相关产品推荐

