我正在开发一个应用程序,我正在使用一个开源组件。
我有一个包含 MyApp.xcodeproj 和 Component.xcodeproj 的工作区。我的应用程序有三种配置:调试, App Store 和 In House ,但该组件只有两个: Debug 和版本的
在 Debug 配置中,一切正常,但我无法在 App Store 或 In House 配置中编译我的应用程序因为配置名称不匹配。在尝试#import <Component/Component.h>
我需要 App Store 和 In House 配置,我真的想避免修改组件的配置,以便于将来更新组件
我知道我可以使用CocoaPods来解决这个问题,但我想知道Xcode中是否有一个简单的解决方案
答案 0 :(得分:43)
您可以通过对应用程序设置进行一些调整来编译项目。
我建议您修改项目级别的所有设置,以便所有目标都可以继承这些设置。
添加新的DEFAULT_CONFIGURATION
用户定义设置并定义配置映射。这就是它应该是这样的:
针对所有配置将FRAMEWORK_SEARCH_PATHS
设置为$(BUILD_DIR)/$(DEFAULT_CONFIGURATION)-$(PLATFORM_NAME)
,添加任何OS X SDK 变体并将值设置为$(BUILD_DIR)/$(DEFAULT_CONFIGURATION)
。将HEADER_SEARCH_PATHS
设为$(FRAMEWORK_SEARCH_PATHS)/include
,将LIBRARY_SEARCH_PATHS
设为$(FRAMEWORK_SEARCH_PATHS)
。这就是它应该是这样的:
这一步非常繁琐,可以使用xcproj工具自动完成,也可以在项目目录中运行此脚本。根据需要编辑配置映射。
#!/bin/bash
CONFIGURATIONS=( "App Store:Release" "In House:Release" "Debug:Debug" )
for CONFIGURATION in "${CONFIGURATIONS[@]}"; do
xcproj --configuration "${CONFIGURATION%%:*}" write-build-setting DEFAULT_CONFIGURATION "${CONFIGURATION#*:}"
done
xcproj write-build-setting 'FRAMEWORK_SEARCH_PATHS' '$(BUILD_DIR)/$(DEFAULT_CONFIGURATION)-$(PLATFORM_NAME)'
xcproj write-build-setting 'FRAMEWORK_SEARCH_PATHS[sdk=macosx*]' '$(BUILD_DIR)/$(DEFAULT_CONFIGURATION)'
xcproj write-build-setting 'HEADER_SEARCH_PATHS' '$(FRAMEWORK_SEARCH_PATHS)/include'
xcproj write-build-setting 'LIBRARY_SEARCH_PATHS' '$(FRAMEWORK_SEARCH_PATHS)'
如果组件作为静态库分发,则在此处完成。如果组件作为框架提供,则必须通过在文本编辑器中编辑project.pbxproj文件来更新其路径引用。在PBXFileReference部分(在/* Begin PBXFileReference section */
下)找到Component.framework
并更新其path
,如下所示:
name = Component.framework; path = "../$(DEFAULT_CONFIGURATION)/Component.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
还要确保sourceTree
设置为BUILT_PRODUCTS_DIR
,即相对于内置产品。编辑项目文件后,它应如下所示:
您的项目现在应按预期进行构建。
答案 1 :(得分:5)
我遇到了同样的问题,但我的应用程序中有多个配置(Debug, TestFlight ,Release, Enterprise ),并且粗体配置始终无法构建因为它无法找到框架。我真的不想弄乱我的子项目的项目设置,以便更新它们。
我找到的答案是更新框架搜索路径,以解释框架将在子项目的Release(或任何默认配置设置)中删除的事实。
具体来说我把它设置为: $(BUILD_DIR)/释放 - $(PLATFORM_NAME)
我也把它设置为递归。这适用于模拟器和设备,在Xcode和命令行中构建。
答案 2 :(得分:0)
我通过以下方式解决了
在我的依赖项目中,
Project -> Target -> Build Phases
,添加了新的运行脚本
TARGET_DIR="Build"
TARGET_FILE="${TARGET_DIR}/${FULL_PRODUCT_NAME}"
mkdir -p ${TARGET_DIR}
rm -rf ${TARGET_FILE}
cp -rf "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}" ${TARGET_DIR}
在每次构建之后,我将构建复制到项目内的Build目录中。
在主要项目中
Project -> Target -> General
,我拖放了依赖项框架(位于依赖项项目的Build
文件夹中)
然后,
Project -> Target -> Build Settings -> Framework Search Paths
在我的自定义构建配置下,添加了以下内容
$(PROJECT_DIR)/../DependencyProject/Build
该文件夹相对于我的主项目,并且应该相对于您的项目。 然后在所有方案中,我为Build with
添加了一个Pre-actions脚本。rm -Rf "${PROJECT_DIR}/../DependencyProject/Build"
还需要针对Provide build settings from
下拉菜单选择应用。