多Target项目中Cocoapods集成SwiftGen构建失败的配置问题
import的问题 我之前维护多Target项目时也碰到过完全一致的状况,结合SwiftGen 5.x的特性和Xcode 9.2的配置细节,给你几个针对性的解决方案,按优先级尝试:
1. 针对不同Target配置独立的SwiftGen参数
你的两个Target(主项目和Dev环境)可能共享了同一套SwiftGen配置,但ignoreTargetModule: true的生效逻辑可能因为Target名称带空格("MyProject Dev")出现异常。可以在Run Script中根据当前Target动态切换配置:
首先在项目根目录创建两个SwiftGen配置文件:swiftgen-main.yml和swiftgen-dev.yml,两个文件中都明确设置:
strings: inputs: Resources/Localizable.strings outputs: templateName: structured-swift5 output: Generated/Strings.swift params: ignoreTargetModule: true # 其他资源(如Assets、Storyboards)的配置同理,都加上ignoreTargetModule: true
然后修改Run Script脚本,根据Target名称选择对应的配置文件执行:
# 先切换到项目根目录 cd "${PROJECT_DIR}" # 判断当前Target并执行对应SwiftGen配置 if [ "$TARGET_NAME" = "MyProject" ]; then "${PODS_ROOT}/SwiftGen/bin/swiftgen" config run --config swiftgen-main.yml elif [ "$TARGET_NAME" = "MyProject Dev" ]; then "${PODS_ROOT}/SwiftGen/bin/swiftgen" config run --config swiftgen-dev.yml fi
2. 强制清空SwiftGen的模块名称环境变量
SwiftGen会自动读取Xcode的MODULE_NAME环境变量来生成import语句,即便你设置了ignoreTargetModule: true,如果Target名称解析有问题(比如带空格的Target被错误识别),可能还是会生成多余的import。可以在Run Script开头强制清空该变量:
export SWIFTGEN_MODULE_NAME="" # 然后执行SwiftGen命令 "${PODS_ROOT}/SwiftGen/bin/swiftgen" config run --config swiftgen.yml
3. 检查Target的Build Settings配置
确认"MyProject Dev"的Build Settings中,以下两个参数是否正确:
- Product Module Name:建议设置为
MyProjectDev(不带空格,避免解析异常),如果要保留原名需确保SwiftGen能正确识别 - Other Swift Flags:没有添加可能干扰模块识别的参数
同时检查两个Target的Generated目录是否被正确添加到各自的Compile Sources中,且没有互相覆盖的情况。
4. 兜底:自定义SwiftGen模板移除import语句
如果以上方案都无效,可以直接修改SwiftGen的模板,去掉自动生成的import语句:
- 找到SwiftGen的模板目录,路径一般是
${PODS_ROOT}/SwiftGen/templates - 找到你正在使用的模板(比如
strings/structured-swift5) - 打开模板文件,删除或注释掉开头的
import <%= moduleName %>行 - 清理Derived Data后重新构建
最后别忘了执行彻底的清理操作:Command+Shift+K清理项目,手动删除~/Library/Developer/Xcode/DerivedData下对应项目的文件夹,然后重新构建。
内容的提问来源于stack exchange,提问作者Alexei

