如何在具有不同配置名称的同一工作区中编译包含应用程序和库的项目?

How to compile a project with app and library in the same workspace with different configuration names?

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

我有一个包含 MyApp.xcodeprojComponent.xcodeproj 的工作区。我的应用程序具有三种配置:DebugApp StoreIn House 但组件只有两种: 调试发布

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

时出现文件未找到错误

我需要 App StoreIn House 配置,我真的很想避免修改组件的配置,以便将来使用组件的更新。

我知道我可以使用 CocoaPods 来解决这个问题,但我想知道 Xcode

中是否有简单的解决方案

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

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

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

  2. 将所有配置的 FRAMEWORK_SEARCH_PATHS 设置为 $(BUILD_DIR)/$(DEFAULT_CONFIGURATION)-$(PLATFORM_NAME),添加 Any 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)'
    
  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,即相对于构建的产品。编辑项目文件后,它应该如下所示:

您的项目现在应该按预期生成。

我遇到了同样的问题,但我的应用程序中有多个配置(调试、TestFlight、发布、企业),并且加粗的配置总是无法构建,因为它找不到框架。我真的不想弄乱我的子项目的项目设置,以便轻松更新它们。

我找到的答案是只更新框架搜索路径以说明框架将在子项目的发布(或任何默认配置设置)中删除的事实。

具体我设置为: $(BUILD_DIR)/发布-$(PLATFORM_NAME)

我也设置成递归了。这适用于模拟器和设备,在 Xcode 和命令行中构建。

我是按照下面的方法解决的,

在我的依赖项目中, 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"

您还需要 select 应用程序针对 Provide build settings from 下拉。