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