如何在具有不同配置名称的同一工作区中使用app和库编译项目?

时间:2015-06-17 07:19:03

标签: xcode xcode-workspace

我正在开发一个应用程序,我正在使用一个开源组件。

我有一个包含 MyApp.xcodeproj Component.xcodeproj 的工作区。我的应用程序有三种配置:调试 App Store In House ,但该组件只有两个: Debug 版本

Debug 配置中,一切正常,但我无法在 App Store In House 配置中编译我的应用程序因为配置名称不匹配。在尝试#import <Component/Component.h>

时,我收到了一个找不到文件的错误

我需要 App Store In House 配置,我真的想避免修改组件的配置,以便于将来更新组件

我知道我可以使用CocoaPods来解决这个问题,但我想知道Xcode中是否有一个简单的解决方案

3 个答案:

答案 0 :(得分:43)

您可以通过对应用程序设置进行一些调整来编译项目。

我建议您修改项目级别的所有设置,以便所有目标都可以继承这些设置。

  1. 添加新的DEFAULT_CONFIGURATION用户定义设置并定义配置映射。这就是它应该是这样的:

    Default Configuration Screenshot

  2. 针对所有配置将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)。这就是它应该是这样的:

    Search Paths Screenshot

    这一步非常繁琐,可以使用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)'
    
  3. 如果组件作为静态库分发,则在此处完成。如果组件作为框架提供,则必须通过在文本编辑器中编辑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,即相对于内置产品。编辑项目文件后,它应如下所示:

    Location Screenshot

  4. 您的项目现在应按预期进行构建。

答案 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下拉菜单选择应用。