14

TL;博士

是否可以从父项目继承自定义配置?不,不是询问继承某些目标设置。

配置和预处理器宏/标志

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

#ifdef DEBUG
   print("DEBUG flag set")
#else 
   print("No debug flag!")
#endif

这也适用于 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

从而为主项目和框架项目的配置声明DEBUG标志(因为继承自...)。 DebugFramework.xcconfigMain.xcconfig

自定义配置

如果我们希望能够分析应用程序但DEBUG设置了标志怎么办?分析应该使用与Release. 但是我们绝对不想为构建设置DEBUG标志。Release

为什么不创建一个新的配置,我们称之为Profiling问题来了!当然,我们应该为主项目创建这个新配置。然后我们编辑我们的方案和配置文件,在 构建配置下我们选择了新配置 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

我们尝试运行模拟器,我们看到“没有调试标志!” ,这是预期的,因为我们正在使用Debug配置,因此没有声明DEBUG标志。

所以我们尝试分析并开始一些仪器测量并打开控制台。在那里我们看到消息“DEBUG flag set”

有效,太好了!

配置不是从父项目继承的

我们刚刚检查DEBUG了主项目中的标志。如果我们在某些框架中想要检查我们的标志会发生什么。所以我们#ifdef DEBUG在一些框架中尝试。这行得通,因为所有框架都有配置 Debug,因为它是所有项目的默认设置(连同Release)。

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

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

对我来说这是难以置信的……感觉就像 Xcode 中的一个缺陷。

糟糕的解决方案

除了将相同的配置 Profiling添加到所有框架项目(至少对于我知道我想检查该标志的框架)之外,我不知道任何其他解决方案。但这感觉就像一个丑陋的解决方案!. 我至少有 10 个框架,不得不为每个框架添加特定配置感觉真的很难看。

替代(可怕!)解决方案

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

OTHER_SWIFT_FLAGS[config=Release] = -D DEBUG
GCC_PREPROCESSOR_DEFINITIONS[config=Release] = DEBUG

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

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

然后我们可以添加一个名为Main 项目的新配置AppStore,并且只添加 Main 项目并将其用于归档应用程序。到目前为止,一切都很好?

这是一个陷阱!

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

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

好的解决方案?

我一个都不知道……你呢?如果从父项目继承配置不是很好吗?那将解决一切!苹果...漂亮吗?

4

1 回答 1

0

作为解决方法:为每个项目和全局文件创建 xconfig 文件。在项目中的 xconfig 文件中包括全局文件通过

#include "路径/到/File.xcconfig"

希望这有帮助

于 2019-12-12T13:28:50.817 回答