TL;博士
是否可以从父项目继承自定义配置?不,不是询问继承某些目标设置。
配置和预处理器宏/标志
Xcode 中的每个项目都使用名为和的两个标准配置进行初始化。使用构建设置中显示名称下的设置为目标(在此称为)设置标志是一种非常常见的模式,可以像这样从 Objective-C 代码中读取。Debug
Release
DEBUG
Preprocessor Macros
.pbxproj
GCC_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
标志(因为继承自...)。 Debug
Framework.xcconfig
Main.xcconfig
自定义配置
如果我们希望能够分析应用程序但DEBUG
设置了标志怎么办?分析应该使用与Release
. 但是我们绝对不想为构建设置DEBUG
标志。Release
为什么不创建一个新的配置,我们称之为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
配置,因此没有声明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
添加了标志声明,并且当我们归档应用程序时,它是用于我们所有框架的配置=>我们的生产应用程序将包含调试代码!. 这是非常不受欢迎的并且具有潜在危险。 Release
Release
好的解决方案?
我一个都不知道……你呢?如果从父项目继承配置不是很好吗?那将解决一切!苹果...漂亮吗?