具有多个 .xcconfig 文件和 cocoapods 的复杂 Xcode 项目

Posted

技术标签:

【中文标题】具有多个 .xcconfig 文件和 cocoapods 的复杂 Xcode 项目【英文标题】:complex Xcode project with multiple .xcconfig files and cocoapods 【发布时间】:2013-03-06 21:23:09 【问题描述】:

我正在处理一个 ios 项目,不幸的是,我们必须使用的一些库有两个版本。一个用于调试的版本,一个用于生产的版本。 无法使用生产库进行调试。并且同样不能使用调试库。正在生产中。

为了解决这个问题,我们在项目中设置了多个目标(一个用于调试,一个用于生产)。这些目标使用单独的 .xcconfig 文件(App-Debug.xcconfig 和 App-Production.xcconfig)为每个目标定义:LIBRARY_SEARCH_PATHS、HEADER_SEARCH_PATHS 和 OTHER_LDFLAGS。

这一切都很好,但是手动跟踪我们所有的第三方依赖项变得很痛苦。 因此我们决定开始使用 CocoaPods 来管理我们的一些第三方依赖项。

但是由于这些“两个版本”的库,我们不能按预期使用 Pods.xcconfig,而是需要将其中的设置附加到我们自己的 App-Debug.xcconfig 和 App-Production.xcconfig 中。

我不确定执行此操作的正确方法,因为我尝试的所有方法似乎都无法编译,因为找不到我的 pod。

我们的 Pods.xcconfig:

ALWAYS_SEARCH_USER_PATHS = YES
HEADER_SEARCH_PATHS = $PODS_HEADERS_SEARCH_PATHS
LIBRARY_SEARCH_PATHS = "$(PODS_ROOT)/TestFlightSDK"
OTHER_LDFLAGS = -ObjC -lTestFlight -lz -framework SystemConfiguration -framework UIKit
PODS_BUILD_HEADERS_SEARCH_PATHS = "$PODS_ROOT/BuildHeaders" "$PODS_ROOT/BuildHeaders/AFNetworking" "$PODS_ROOT/BuildHeaders/TestFlightSDK"
PODS_HEADERS_SEARCH_PATHS = $PODS_PUBLIC_HEADERS_SEARCH_PATHS
PODS_PUBLIC_HEADERS_SEARCH_PATHS = "$PODS_ROOT/Headers" "$PODS_ROOT/Headers/AFNetworking" "$PODS_ROOT/Headers/TestFlightSDK"
PODS_ROOT = $SRCROOT/Pods

App-Debug.xcconfig:

#include "Config-XXX.xcconfig"
#include "Config-Tesseract.xcconfig"
#include "Config-AppMeasurement.xcconfig"
#include "Config-Libxml2.xcconfig"
#include "Config-Frameworks.xcconfig"

LIBRARY_SEARCH_PATHS = $(inherited) $(XXX_LIBRARY_SEARCH_PATH_DEBUG) $(TESSERACT_LIBRARY_SEARCH_PATH) $(APPMEASUREMENT_LIBRARY_SEARCH_PATH)

HEADER_SEARCH_PATHS = $(inherited) $(TESSERACT_HEADER_SEARCH_PATH) $(LIBXML2_HEADER_SEARCH_PATH) $(XXX_HEADER_SEARCH_PATH)

OTHER_LDFLAGS = $(inherited) -lz -lxml2 -lstdc++ -all_load -ObjC -lXXXLibrary $(APPLE_FRAMEWORKS)

App-Production.xcconfig:

#include "Config-XXX.xcconfig"
#include "Config-Tesseract.xcconfig"
#include "Config-AppMeasurement.xcconfig"
#include "Config-Libxml2.xcconfig"
#include "Config-Frameworks.xcconfig"

LIBRARY_SEARCH_PATHS = $(inherited) $(XXX_LIBRARY_SEARCH_PATH_PRODUCTION) $(TESSERACT_LIBRARY_SEARCH_PATH) $(APPMEASUREMENT_LIBRARY_SEARCH_PATH)

HEADER_SEARCH_PATHS = $(inherited) $(TESSERACT_HEADER_SEARCH_PATH) $(LIBXML2_HEADER_SEARCH_PATH) $(XXX_HEADER_SEARCH_PATH)

OTHER_LDFLAGS = $(inherited) -lz -lxml2 -lstdc++ -all_load -ObjC -lXXXLibrary $(APPLE_FRAMEWORKS)

Config-XXX.xcconfig:

XXX_LIBRARY_SEARCH_PATH_DEBUG = "$(SRCROOT)/External/XXX"
XXX_LIBRARY_SEARCH_PATH_PRODUCTION = "$(SRCROOT)/External/XXX/LibProd"

XXX_HEADER_SEARCH_PATH = "$(SRCROOT)/External/XXX/headers"

我们可以看到 Pods.xcconfig 和我们自己的 App-Debug.xcconfig 设置了:LIBRARY_SEARCH_PATHS、HEADER_SEARCH_PATHS 和 OTHER_LDFLAGS。

我需要将 Pods.xcconfig 中声明的值附加到我们在 App-Debug.xcconfig 中声明的值。

我们正在使用 Xcode 4.6 并为 iOS 4.3 构建。

【问题讨论】:

【参考方案1】:

您的 podfile 可以支持这一点。你应该得到这样的结果

platform :ios, "5.0"
link_with ['App', 'App-Debug'] 

pod 'Shared-Pod'

target :App, :exclusive => true do
  pod 'Normal-Pod'
end

target :App-Debug, :exclusive => true do
  pod 'Debug-Pod'
end

这将生成两个 xcconfig 文件,每个目标一个。

【讨论】:

这真是太棒了,我不知道这是可能的。在接下来的几天里,我会尝试一下 - 我们还没有设置来处理自定义 pod。【参考方案2】:

尝试在配置中为XXX_LIBRARY_PATH 定义不同的值,而不是使用两个目标(遗憾的是,这在GUI 中最简单)。如果你只有两个配置并且它们被适当地命名,你甚至可以做类似XXX_LIBRARY_PATH = FooPath/$(CONFIGURATION)的事情。

一个目标配置不可能将属性附加到另一个; “继承”严格来说是 SDK → Project[Config] → Target[Config]。

【讨论】:

我们现在解决这个问题的方法(不使用 cocoapods)是为 XXXLibrary 定义两个搜索路径。我用 Config-XXX.xcconfig 的内容编辑了我的帖子但这不是问题,当我们尝试将一些第三方依赖项移动到 cocoapods 时,问题就出现了。那么我们移动的依赖Xcode就找不到了,项目也就构建不了了。

以上是关于具有多个 .xcconfig 文件和 cocoapods 的复杂 Xcode 项目的主要内容,如果未能解决你的问题,请参考以下文章

xcconfigs:如何为一个目标设置多个配置

iOS多工程中子工程依赖pod通过xcconfig文件配置

有没有办法在 Xcode 9 中更改每个方案的 .xcconfig 文件?

每个目标有多个配置文件

目标 ... 覆盖在 `Pods/Pods.xcconfig 中定义的 `OTHER_LDFLAGS` 构建设置

XCConfig 在 Xcode 重新启动之前不会刷新