【发布时间】:2012-01-20 12:23:05
【问题描述】:
概述
我正在使用静态库和 Xcode 4 工作区来实现 iOS 开发中的模块化,这是一种越来越普遍的技术。例如,我可能有一个包含 App 项目和 Library 项目的工作区,如下所示1:
然后,您将有一个构建这些的方案,看起来像这样:
我想做的是让“App build”控制它启动的“Library build”,至少有两种方式:
-
将应用配置(例如 Debug、AdHoc)映射到任意库配置
-
通过 -D 定义的某些子集,和/或为库构建指定这些。
我将在各自的部分中处理每一个问题,但值得澄清一下。
说明
-
我在这里使用 App/Library 作为您可能拥有的任何超级项目/子项目关系的简单代理。
-
据我所见,Xcode 3 风格的嵌入式子项目在 Xcode 4 中的工作方式似乎与工作区“对等方”没有任何不同。我很愿意在这件事上犯错。
-
我知道我几乎可以使用“运行构建脚本”构建阶段和 xcodebuild 来做任何事情。但我在这里尝试在系统中工作,其中依赖项在方案中指定,否则有些松散耦合。
-
库的存在不仅仅用于此项目,因此您不能随意使用特定于该应用程序构建的垃圾加载它,或引用任何特定于应用程序或工作区的内容。对于一般情况,这排除了在 App 项目中包含静态 .xcconfig 作为将构建信息从 App 传递到库的一种方式。
-
在工作区之外构建库牺牲太多,不是一种选择。
配置映射
据我了解,构建特定的应用配置将:
- 如果库中存在同名配置,它将使用该配置构建库。
- 否则,它将按照库的项目文件中的指定构建库的活动配置。
据我所知,在不诉诸上述 run-build-script hack 的情况下,这就是人们对子项目构建配置的控制程度。请告诉我不同的。
理想情况下,我可以指定(大概在方案中):
AppConfigA -> LibConfig1
AppConfigB -> LibConfig2
虽然 Debug、AdHoc 和 Release 可能是某些人曾经使用的唯一配置,但复杂的项目通常会超出这些配置。
定义
我还没有找到将 -D 定义从 App 构建传递到库的方法,而无需借助 xcodebuild,它可以采用例如 .xcconfig 文件。
可以在库构建运行-构建-脚本阶段访问应用程序的构建设置。但是,这样做会在库中引入对 App 项目的依赖,这有充分的理由被禁止(参见 Clarifications)。但即便如此,我还没有找到一种方法来使用这些设置来直接控制库的构建(很多2)。
太疯狂了,它可能会......
我在写这篇文章时想到的一个方案是:
-
库的构建配置基于它自己项目中的空(虚拟)
LibraryExternals.xcconfig文件。 -
清理库会删除该文件。如果库不存在,则独立构建的库将创建一个空库。
-
该文件被 App Build run-build-script 阶段覆盖,并包含应用想要与 Library build 通信的任何内容。
看起来有点复杂,但我现在正在寻找任何东西。如果没有更好的结果,我会提出这个答案。
1 显示的应用是 Max OS X。我发现命令行应用可以简化测试。同样适用。
2 参见。 Info.plist 预处理,这是我在这次调查中了解到的。
【问题讨论】:
-
非常重要的问题,我找不到解决方法。使用预构建操作似乎甚至无法传递环境变量。
标签: xcode xcode4 xcodebuild