如何为项目配置同名的Debug/Release版本Framework
Debug/Release分别嵌入同名Framework的解决方案
方法一:条件化添加Framework(最稳妥)
这是Xcode原生支持的方式,能彻底避免「Multiple commands produce」错误:
- 先移除Embed Frameworks中已添加的所有同名Framework,避免冲突残留。
- 将Debug和Release版本的
MyFramework.xcframework都添加到项目中(拖到Project Navigator即可,不要直接拖进Embed Frameworks)。 - 选中项目里的Debug版
MyFramework.xcframework,打开右侧File Inspector:- 在Target Membership区域,只勾选当前Target的Debug配置,取消Release的勾选。
- 同样操作Release版的
MyFramework.xcframework:只勾选Release配置,取消Debug的勾选。 - 把这两个Framework都添加到Embed Frameworks列表中:
- 选中Embed Frameworks里的Debug版Framework,点击右侧Build Settings标签,找到Condition列,设置为
CONFIGURATION == Debug。 - 对Release版Framework做同样操作,Condition设为
CONFIGURATION == Release。
- 选中Embed Frameworks里的Debug版Framework,点击右侧Build Settings标签,找到Condition列,设置为
这样Xcode在构建Debug时只会处理Debug版框架,构建Release时只处理Release版,完全不会出现重复命令的问题,还能自动完成签名和嵌入流程。
方法二:修复Run Script脚本(适合复杂场景)
如果一定要用脚本复制的方式,需要调整脚本逻辑和执行顺序:
- 移除Embed Frameworks中的所有同名Framework,避免Xcode自动处理冲突。
- 在Build Phases中添加Run Script Phase,拖动到Embed Frameworks之前执行,脚本内容修改为:
# 先清理目标目录的旧框架,防止残留冲突 rm -rf "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/MyFramework.xcframework" # 根据当前配置复制对应版本的框架 if [ "$CONFIGURATION" = "Debug" ]; then SOURCE_FRAMEWORK="${PROJECT_DIR}/Debug/MyFramework.xcframework" else SOURCE_FRAMEWORK="${PROJECT_DIR}/Release/MyFramework.xcframework" fi # 复制框架到目标目录 if [ -d "$SOURCE_FRAMEWORK" ]; then cp -R "$SOURCE_FRAMEWORK" "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/" fi - 配置Build Settings:
- 在Framework Search Paths中添加
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH),并勾选Recursive。 - 在Other Linker Flags中添加
-framework MyFramework。
- 在Framework Search Paths中添加
- 最后在Embed Frameworks中添加复制后的框架路径:点击
+-> Add Other -> Add Files,选择${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/MyFramework.xcframework(如果找不到,先执行一次构建生成目录),并确保其Condition设置为Any SDK(因为脚本已经处理了版本切换)。
为什么原脚本没生效?
- 脚本执行顺序可能在Embed Frameworks之后,导致Xcode先处理了旧框架,复制的新版本没起作用。
- 没有清理目标目录的旧框架,新旧版本冲突导致错误。
解决「No such module 'MyFramework'」错误
出现这个问题的核心是Xcode找不到模块,需要确保:
- Framework的Target Membership已正确勾选对应配置的Target。
- Framework Search Paths包含了Framework所在的目录,并且勾选了Recursive。
- 如果是静态Framework,不需要添加到Embed Frameworks,只需要在Link Binary With Libraries中添加即可。
内容的提问来源于stack exchange,提问作者Marshall
相关产品推荐
相关产品推荐

