我们开发了一个开源框架,可以使用各种预处理器标志来启用/禁用某些功能。至关重要的是,这些功能仅在(框架用户)实际需要时才编译,因为它们可能会影响 App Store 提交。在运行时配置功能不是一个选项。
该框架作为标准 iOS 框架出现,即它动态链接并嵌入到宿主应用程序中,因此有自己的构建设置,与宿主应用程序不同。
为了允许上述配置,框架项目使用xcconfig
其根目录中的一个文件,该文件包含一个挂钩到框架目录之外的可选文件:
#include? "../FrameWorkConfigurationFlags.xcconfig"
这允许用户在框架目录之外提供配置文件,例如,如果您使用 git 子模块,这很重要。
我们还提供了一个链接/嵌入框架的示例应用程序(通过 Xcode 子项目)并需要提供配置,但与框架位于同一目录/存储库中,因此无法使用挂钩。
HostAppDir
|-- FrameWorkConfigurationFlags.xcconfig
`-- Framework
|-- ConfigurationWithHook.xcconfig
`-- SampleApp
`-- SampleConfigurationFlags.xcconfig
任何有创意的想法如何解决这个问题?我们考虑过的几件事:
将第二个钩子添加到框架目录/存储库中的路径,这不起作用,因为如果用户签出包含示例应用程序的框架,将始终使用示例应用程序的配置
也许有一个环境变量可以用来检测宿主应用程序的源目录?类似的东西
#include? "$(SRCROOT)/FrameWorkConfigurationFlags.xcconfig"
,但$(SRCROOT)
不是框架的目录,而是主机应用程序的目录。似乎有特殊处理<DEVELOPER_DIR>
,但我也不能在包含路径中使用一般环境变量。我们可以重构我们的示例应用程序以使用 CocoaPods 签出和嵌入框架,并忽略已经存在的本地副本,但我们不希望需要任何额外的技术来使用示例应用程序
编写自定义构建脚本阶段...