Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 如何在同一个工作区中使用不同的配置名称编译应用程序和库的项目?_Xcode_Xcode Workspace - Fatal编程技术网

Xcode 如何在同一个工作区中使用不同的配置名称编译应用程序和库的项目?

Xcode 如何在同一个工作区中使用不同的配置名称编译应用程序和库的项目?,xcode,xcode-workspace,Xcode,Xcode Workspace,我正在开发一个应用程序,我正在使用一个开源组件 我有一个包含MyApp.xcodeproj和Component.xcodeproj的工作区。我的应用有三种配置:调试、应用商店和内部,但组件只有两种:调试和发布 在调试配置中,一切正常,但我无法在app Store或内部配置中编译我的应用程序,因为配置名称不匹配。我在尝试导入时遇到一个文件未找到错误 我需要App Store和内部配置,我真的希望避免修改组件的配置,以简化组件的未来更新 我知道我可以使用CocoaPods来解决这个问题,但我想知道在

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

我有一个包含MyApp.xcodeproj和Component.xcodeproj的工作区。我的应用有三种配置:调试、应用商店和内部,但组件只有两种:调试和发布

在调试配置中,一切正常,但我无法在app Store或内部配置中编译我的应用程序,因为配置名称不匹配。我在尝试导入时遇到一个文件未找到错误

我需要App Store和内部配置,我真的希望避免修改组件的配置,以简化组件的未来更新


我知道我可以使用CocoaPods来解决这个问题,但我想知道在Xcode中是否有一个简单的解决方案,您可以通过对应用程序设置的一些调整来编译您的项目

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

  • 添加新的
    DEFAULT\u配置
    用户定义的设置并定义配置映射。它应该是这样的:

  • FRAMEWORK\u SEARCH\u path
    设置为
    $(BUILD\u DIR)/$(默认配置)-(PLATFORM\u NAME)
    对于所有配置,添加任何OS X SDK变体,并将值设置为
    $(BUILD\u DIR)/$(默认配置)
    。将
    标题搜索路径设置为
    $(框架搜索路径)/include
    库搜索路径设置为
    $(框架搜索路径)
    。它应该是这样的:

    这个步骤相当繁琐,可以使用该工具并通过在项目目录中运行此脚本来实现自动化。根据需要编辑配置映射

    #!/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部分(在
    /*开始PBXFileReference部分*/
    下)找到
    组件.framework
    ,并更新其
    路径,如下所示:

    name = Component.framework; path = "../$(DEFAULT_CONFIGURATION)/Component.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
    
    还要确保
    sourceTree
    设置为
    builded\u PRODUCTS\u DIR
    ,即相对于builded PRODUCTS。编辑项目文件后,应如下所示:


  • 您的项目现在应该按照预期进行构建。

    我也遇到了同样的问题,但我的应用程序中有多个配置(调试、测试飞行、、发布、企业版),粗体配置总是无法构建,因为它找不到框架。我真的不想为了便于更新而弄乱子项目的项目设置

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

    具体而言,我将其设置为: $(构建目录)/发布-$(平台名称)


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

    我用下面的方法解决了这个问题

    在我的依赖项目中,
    项目->目标->构建阶段
    ,添加了新的运行脚本

    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}
    
    在每次构建之后,我将构建复制到项目中的构建目录中。 从主体工程来看,,
    Project->Target->General
    ,我拖放了依赖关系框架(它位于依赖关系项目的
    Build
    文件夹中) 那么,
    Project->Target->Build Settings->Framework Search path
    ,在我的自定义构建配置下,我添加了以下内容

    $(PROJECT_DIR)/../DependencyProject/Build
    
    该文件夹是相对于我的主项目的,这应该是相对于您的项目的。 然后,在我的所有方案中,我添加了一个用于构建的预操作脚本

    rm -Rf "${PROJECT_DIR}/../DependencyProject/Build"
    

    您还需要根据
    下拉列表中的
    提供构建设置来选择应用程序。

    当我将任何非调试设置为调试时,这对我无效。Xcode将隐式构建版本1,这与您的示例一致。如果我将InHouse设置为Debug,则会出现编译失败。关于@BrentleyJones的评论:这个解决方案是否可能只适用于所介绍的特定情况?请注意,“调试”映射到“调试”,而非“调试”映射到“发布”。如果库不使用“Debug”和“Release”,而是使用“Blue”和“Red”,那么它是否仍然有效?当框架上有两个以上的配置时,这不起作用。例如,我对框架进行了调试、内部调试和发布。我映射我的应用程序的调试->调试,内部->内部,应用商店->发布。根据您的示例,调试和AppStore可以工作,但InHouse不能,因为Xcode会构建发布版本。这是因为,当Xcode无法完全匹配配置时,它将生成任何列为“命令行配置”的内容,即使正确设置了框架的位置。@Klaas我现在所做的是添加一个新的运行脚本步骤,将框架复制到它们最终的位置(例如发布版):我在执行测试时遇到了一个问题,因为Xcode以某种方式获取了我的框架的发布版本,该版本(显然)尚未编译用于测试。有没有人遇到过类似的问题?我用这个问题来帮助我解决这个问题,但反过来说。应用程序有2个配置,但框架有3个。我现在在尝试切换到自定义配置(不是调试或发布)时遇到了问题。尽管为每个父配置设置了父项目的
    DEFAULT\u配置
    ,但它似乎并不尊重框架的配置