如何使用不同的构建配置设置Xcode项目依赖关系?

12

我有一个Xcode 7.3的工作空间,包含三个项目:App、FrameworkA和FrameworkB。每个项目都有一个目标。由于这是iOS,所以框架目标是Cocoa Touch Frameworks,也就是包含动态链接共享库的框架。

App依赖于Framework A,而Framework A又依赖于Framework B。这些依赖关系是有效的,因为A正确地链接到了B的构建产品,而App正确地链接并嵌入了两个框架A和B(因为你不能让一个框架嵌入另一个框架,所以似乎应用程序包需要链接并嵌入直接和传递的依赖项)。

但这是我的问题。框架A和B具有通常的构建配置,即Debug和Release。App有一个额外的构建配置LocalRelease,它由Run构建操作触发,并用于构建一个经过优化的构建(类似于Release),但使用开发者身份进行代码签名(类似于Debug)。

当我尝试使用此LocalRelease构建配置构建App时,这会破坏依赖关系,因为它会破坏对框架A和B的依赖关系。我相信这是因为这些框架没有LocalRelease构建配置,因此Xcode永远不会将它们的构建产品放入LocalRelease-iphoneos文件夹中,就像对待App一样。

因此,我的具体问题是,如何配置构建设置,使具有非标准构建配置名称(例如LocalRelease)的项目可以依赖使用仅标准构建配置名称的其他项目?我希望有一种简单的方法来做到这一点,而不需要添加脚本或xcconfig文件,但如果这些是必要的,我希望能理解为什么。

我的更广泛的问题是,引入额外的构建配置是否总体上是一个不好的主意,因为它们不允许在共享工作空间中的项目之间平稳交互的依赖关系?我之所以定义了这个第三个配置,是因为我想要一个经过优化的本地构建,我不想定义一个新的scheme,并且我希望构建类型的选择通过单个scheme的各种构建操作(运行、分析、发布)来表达。

但也许这并不是正确的做法。只要建立配置名称驱动构建产品目录路径,并且依赖项目需要在共享目录中找到彼此的构建产品,似乎引入非标准的构建配置名称到项目中将会破坏与依赖项目之间的互操作性。

2个回答

7
我向苹果提出了一个开发技术支持工单,并在WWDC上与Xcode工程师交谈,问题如下:
如何配置构建设置,使具有非标准构建配置名称(如LocalRelease)的项目可以依赖于仅使用标准构建配置名称的其他项目?
答案:无法完成。
引入额外的构建配置是否总体上是个坏主意,因为它们不允许共享工作区中各个项目之间的依赖平稳互动?
答案:是的,这是一个坏主意。
因此,创建新命名的构建配置并不是我尝试做的聪明方法。 不幸的是,“最简单”的解决方案似乎是采用xcconfig文件并手动更改配置文件。

2
为什么不能将CONFIGURATION_BUILD_DIR设置为LocalRelease配置与Release配置相匹配?这样,框架项目应该与localrelease配置在同一位置。 - Kevlar
将$(BUILD_ROOT)/Release添加到FRAMEWORK_SEARCH_PATHS构建设置中,以便非标准配置可以获取嵌入在Release文件夹中的嵌入式框架。 - Jacob Gorban
这是一个令人沮丧的结果!苹果公司推出了一些不受其自身工具支持的功能!但是,通过将您的框架转换为 Pod,并在使用该框架的应用程序的 Podfile 中添加一个哈希表来进行配置映射(它告诉 CP 哪些自定义配置是“debug”或“release”类型),可以解决这个问题并使其正常工作。 - Rafael Nobre
我创建了一个包含建议解决方案的示例存储库。第一次提交是一个正常工作的项目和框架。一旦引入自定义配置,它就停止工作了。HEAD提交将其转换为pod,并且能够在消费应用程序上使用自定义配置进行良好构建。 https://github.com/nobre84/Dummy - Rafael Nobre

2
在Xcode 11中,如果在项目依赖项中找不到相应的配置,则构建系统会回退到项目配置下的用于命令行构建的{configuration here} 设置。Xcode设置界面清理、构建,然后检查我的构建产品目录,显示该依赖项仅为所选配置构建。

2
然后,对于顶级项目的非标准配置,将$(BUILD_ROOT)/Release添加到FRAMEWORK_SEARCH_PATHS构建设置中,以获取嵌入到发布文件夹(或在“使用{configuration here}”中描述的选择之一)中的嵌入式框架。 - Jacob Gorban
问题在于,当您为“ Debug”配置构建时,通常该配置已经存在于外部框架中,因此在(BUILD_ROOT)/ Release 中没有任何内容,构建阶段失败。 - strangetimes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接