【问题标题】:In an Xcode 4 workspace, how do I cascade build settings & configs to subprojects在 Xcode 4 工作区中,如何将构建设置和配置级联到子项目
【发布时间】:2012-01-20 12:23:05
【问题描述】:

概述

我正在使用静态库和 Xcode 4 工作区来实现 iOS 开发中的模块化,这是一种越来越普遍的技术。例如,我可能有一个包含 App 项目和 Library 项目的工作区,如下所示1:

然后,您将有一个构建这些的方案,看起来像这样:

我想做的是让“App build”控制它启动的“Library build”,至少有两种方式:

  1. 将应用配置(例如 Debug、AdHoc)映射到任意库配置

  2. 通过 -D 定义的某些子集,和/或为库构建指定这些。

我将在各自的部分中处理每一个问题,但值得澄清一下。

说明

  • 我在这里使用 App/Library 作为您可能拥有的任何超级项目/子项目关系的简单代理。

  • 据我所见,Xcode 3 风格的嵌入式子项目在 Xcode 4 中的工作方式似乎与工作区“对等方”没有任何不同。我很愿意在这件事上犯错。

  • 我知道我几乎可以使用“运行构建脚本”构建阶段和 xcodebuild 来做任何事情。但我在这里尝试在系统中工作,其中依赖项在方案中指定,否则有些松散耦合。

  • 库的存在不仅仅用于此项目,因此您不能随意使用特定于该应用程序构建的垃圾加载它,或引用任何特定于应用程序或工作区的内容。对于一般情况,这排除了在 App 项目中包含静态 .xcconfig 作为将构建信息从 App 传递到库的一种方式。

  • 在工作区之外构建库牺牲太多,不是一种选择。

配置映射

据我了解,构建特定的应用配置将:

  1. 如果库中存在同名配置,它将使用该配置构建库。
  2. 否则,它将按照库的项目文件中的指定构建库的活动配置。

据我所知,在不诉诸上述 run-build-script hack 的情况下,这就是人们对子项目构建配置的控制程度。请告诉我不同​​的。

理想情况下,我可以指定(大概在方案中):

AppConfigA -> LibConfig1
AppConfigB -> LibConfig2

虽然 Debug、AdHoc 和 Release 可能是某些人曾经使用的唯一配置,但复杂的项目通常会超出这些配置。

定义

我还没有找到将 -D 定义从 App 构建传递到库的方法,而无需借助 xcodebuild,它可以采用例如 .xcconfig 文件。

可以在库构建运行-构建-脚本阶段访问应用程序的构建设置。但是,这样做会在库中引入对 App 项目的依赖,这有充分的理由被禁止(参见 Clarifications)。但即便如此,我还没有找到一种方法来使用这些设置来直接控制库的构建(很多2)。

太疯狂了,它可能会......

我在写这篇文章时想到的一个方案是:

  1. 库的构建配置基于它自己项目中的空(虚拟)LibraryExternals.xcconfig 文件。

  2. 清理库会删除该文件。如果库不存在,则独立构建的库将创建一个空库。

  3. 该文件被 App Build run-build-script 阶段覆盖,并包含应用想要与 Library build 通信的任何内容。

看起来有点复杂,但我现在正在寻找任何东西。如果没有更好的结果,我会提出这个答案。


1 显示的应用是 Max OS X。我发现命令行应用可以简化测试。同样适用。

2 参见。 Info.plist 预处理,这是我在这次调查中了解到的。

【问题讨论】:

  • 非常重要的问题,我找不到解决方法。使用预构建操作似乎甚至无法传递环境变量。

标签: xcode xcode4 xcodebuild


【解决方案1】:

如果您修改项目结构以使用具有多个目标的单个项目,则每个目标的构建设置将自动从项目继承。从那里,您可以修改您想要不同的设置,或者选择一个单独的设置并按删除键将其设置为项目指定的默认值。

【讨论】:

  • 目标是多个项目,然后可以将它们组合为模块、modularityseparation of concerns 的实例。随着代码库和/或团队规模的扩大,这变得可取。
  • 那么我不相信 Xcode 提供了一种方法来做你想做的事,所以你最好的选择可能是使用自定义构建脚本。抱歉,我不能提供更多帮助。
猜你喜欢
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 2011-11-10
  • 1970-01-01
相关资源
最近更新 更多