Xcode:从父项目继承`configuration`s - 不可能?

Saj*_*jon 8 xcode objective-c xcconfig ios swift

TL; DR

是否可以从父项目继承自定义配置?不,不要求继承一些目标设置.

配置和预处理器宏/标志

在Xcode每个项目都被初始化为两种标准配置DebugRelease.DEBUG使用Preprocessor Macros目标的构建设置中的显示名称下的设置(在.pbxproj此称为GCC_PREPROCESSOR_DEFINITIONS)中设置标志是一种非常常见的模式,可以从这样的Objective-C代码中读取.

#ifdef DEBUG
   print("DEBUG flag set")
#else 
   print("No debug flag!")
#endif
Run Code Online (Sandbox Code Playgroud)

这也适用于Swift,但是我们必须使用OTHER_SWIFT_FLAGS并声明它:
-D DEBUG
并且像我们在上面的Objective C代码中那样读取变量值.

许多项目=> xcconfig文件

我的应用程序包含一个带有主项目的xcworkspace和几个依赖项目.让我们调用我的应用依赖于框架的项目.由于我有几个框架,我不想多次设置构建设置.

因此我正在使用xcconfig文件.我有一个主配置,即主项目的配置文件,我们称之为Main.xcconfig.我有另一个配置文件Framework.xcconfig,从行开始#include "Main.xcconfig",从而继承设置Main.当然,我设置每个框架来使用所述Framework.xcconfig文件.

DEBUG在我们有这些配置文件时声明标志非常方便,Main.xcconfig我们添加:

OTHER_SWIFT_FLAGS[config=Debug] = -D DEBUG
GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = DEBUG
Run Code Online (Sandbox Code Playgroud)

因此声明主项目和框架项目DEBUG配置 标志Debug(因为Framework.xcconfig继承自Main.xcconfig...).

自定义配置

如果我们想要能够分析应用程序但是DEBUG设置了标志会怎样?分析应该使用相同的优化标志来完成Release.但我们绝对不想DEBUGRelease构建设置标志.

为什么不创建一个新配置,让我们称之为Profiling.问题来了!当然,我们应该为主项目创建这个新配置.然后我们编辑我们的方案和Profile,在 Build Configuration下我们选择了新的配置 Profiling.

现在我们可以在文件中设置DEBUG标志.ProfilingMain.xcconfig

OTHER_SWIFT_FLAGS[config=Debug] = -D DEBUG // we keep this
GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = DEBUG // we keep this
OTHER_SWIFT_FLAGS[config=Profiling] = -D DEBUG
GCC_PREPROCESSOR_DEFINITIONS[config=Profiling] = DEBUG
Run Code Online (Sandbox Code Playgroud)

我们尝试运行模拟器,我们看到"没有调试标志!" ,因为运行我们正在使用Debug配置,因此不会声明DEBUG标志.

因此,我们尝试分析并启动一些仪器测量并打开控制台.在那里我们看到消息"DEBUG flag set"

它很棒!

配置不是从父项目继承的

我们刚刚检查DEBUG了Main项目中的标志.如果我们在一些框架中想要检查我们的标志会发生什么.所以我们#ifdef DEBUG在一些框架中尝试.这是有效的,因为所有框架都具有配置 Debug,因为它是所有项目的默认设置(与之一起Release).

然后我们尝试#ifdef DEBUG一个框架项目并再次使用Instruments开始分析.现在我们看到消息"没有调试标志!"

不好了! 它不工作!为什么不?!我不知道,但唯一合理的结论必须是我们的项目作为依赖项添加 - 我们的框架 - 从Main项目继承Profiling 配置.

对我来说,这是令人难以置信的......这感觉就像是Xcode中的一个缺陷.

解决方案不好

除了向所有框架项目添加相同的配置 之外,我不知道任何其他解决方案Profiling(至少对于我知道我想要检查该标志的框架).但这感觉就像是一个丑陋的解决方案!.我有至少10个框架,并且必须为每个框架添加某个配置感觉非常难看.

另类(可怕!)解决方案

是的,当然另一种解决方案是使用Release 配置进行性能分析,并像这样声明DEBUG标志Main.xcconfig:

OTHER_SWIFT_FLAGS[config=Release] = -D DEBUG
GCC_PREPROCESSOR_DEFINITIONS[config=Release] = DEBUG
Run Code Online (Sandbox Code Playgroud)

但由于我们希望能够DEBUG在框架中检查标志,我们需要在上面添加两行,同时声明标志Frameworks.xcconfig.

当然,使用Release 配置分析作为方案的构建配置.

然后我们可以添加一个名为Main项目的新配置AppStore,只添加Main项目并将其用于存档应用程序.到现在为止还挺好?

这是一个陷阱!

不,这不是一个好主意!因为我刚才说的配置没有继承项目和父项目之间.因此我们的框架不会继承这个新的AppStore 配置,所以当框架被构建/存档时,我已经看到它们"回退"到Release 配置(不确定你是否可以在某处选择"默认"/"后备" 配置?也许它会回退到你用作新配置基础的那个?).

但是因为我们刚刚为Main项目和所有框架添加DEBUG配置 标志的声明Release,并且当我们归档app时,它是用于我们所有框架的Release 配置 => 我们的生产应用程序将包含调试代码!.这是非常不受欢迎的,也可能是危险

好解决方案?

我不知道......你呢?如果配置将从父项目继承,那不是很好吗?那会解决一切!Apple ...好吗?

小智 1

解决方法:为每个项目和全局文件创建 xconfig 文件。在项目中 xconfig 文件包含全局配置文件

#include“路径/到/File.xcconfig”

希望这有帮助