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

时间:2016-11-29 10:19:09

标签: ios objective-c swift xcode xcconfig

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

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

许多项目=> xcconfig文件

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

因此我使用的是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

因此为主项目和框架项目声明配置 DEBUG的{​​{1}}标志(因为Debug继承自Framework.xcconfig ...)。

自定义配置

如果我们希望能够对应用进行概要分析但设置了Main.xcconfig标志,该怎么办?应使用与DEBUG相同的优化标志进行性能分析。但我们绝对不希望为Release版本设置DEBUG标记。

为什么不创建新的配置,让我们称之为Release问题出现了!当然我们应该为主项目创建这个新的配置。然后我们编辑我们的方案和 Profile 以及 构建配置我们选择了新的配置 Profiling

现在,我们可以在Profiling文件中为DEBUG设置Profiling标记。

Main.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 配置,因此没有声明Debug标志。

因此,我们尝试分析并启动一些仪器测量和open the console。在那里,我们看到消息" DEBUG标志设置"

很有效!

配置不是从父项目继承的

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

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

哦不! 它不工作!为什么不?!我不知道,但唯一合理的结论必须是我们的项目作为依赖项添加 - 我们的框架 - 不继承 #ifdef DEBUG 配置< / em>来自主项目。

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

糟糕的解决方案

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

替代(可怕!)解决方案

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

Main.xcconfig

但是,由于我们希望能够在框架中检查OTHER_SWIFT_FLAGS[config=Release] = -D DEBUG GCC_PREPROCESSOR_DEFINITIONS[config=Release] = DEBUG 标志,我们需要将上面的两行添加到DEBUG,并将其标记为Frameworks.xcconfig

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

然后我们可以将一个名为AppStore的新配置添加到我们的Main项目中,并且只添加Main项目并将其用于存档应用程序。到目前为止还不错?

IT'S A TRAP!

不,这不是个好主意!因为我刚才说项目和父项目之间的配置。因此,我们的框架不会继承这个新的AppStore 配置,因此当构建/存档框架时,我已经看到了它们&#34; fallback&#34;到Release 配置(不确定你是否可以在某处选择&#34;默认&#34; /&#34;后备&#34; 配置?它将回退到您用作新配置的基础的那个?)。

但是,因为我们刚为Main项目和所有框架添加了配置 DEBUG的{​​{1}}标志声明,它是Release我们归档app =&gt;时用于所有框架的配置 我们的制作应用程序将包含调试代码!。这是非常不受欢迎的,也可能是危险的。

好的解决方案?

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

1 个答案:

答案 0 :(得分:0)

解决方法:为每个项目和全局文件创建xconfig文件。在项目中,xconfig文件通过以下路径包含全局文件:

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

希望获得帮助