使用 Cocoapods 管理多个目标的依赖关系

Posted

技术标签:

【中文标题】使用 Cocoapods 管理多个目标的依赖关系【英文标题】:Manage Dependencies of Multiple Targets with Cocoapods 【发布时间】:2013-01-29 11:02:30 【问题描述】:

我刚刚开始使用 cocoapods 来管理我的 ios 项目的依赖关系。 目前我正在尝试使用 GHIOSUnit 集成单元测试。我遵循了他们的所有指示并尝试了他们的示例测试,这一切都像魅力一样。

但是,当我开始使用我的实际项目文件进行测试时,问题就开始了。

我正在使用 AFNetworking 进行客户端服务器通信,每当我访问名为“CRLClient”的 sharedClient(AFHTTPClient 的包装器)时,都会出现未定义符号错误。

Undefined symbols for architecture armv7:
  "_OBJC_METACLASS_$_AFHTTPClient", referenced from:
      _OBJC_METACLASS_$_CRLClient in CRLClient.o
  "_OBJC_CLASS_$_AFJSONRequestOperation", referenced from:
      objc-class-ref in CRLClient.o
  "_OBJC_CLASS_$_AFHTTPClient", referenced from:
      _OBJC_CLASS_$_CRLClient in CRLClient.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

管理依赖的pod文件长这样

workspace 'Storyboards.xcworkspace'
platform :ios, '5.0'
pod 'AFNetworking', '1.1.0'
target :UnitTests, :exclusive => true do
pod 'GHUnitIOS', '0.5.6'
end

实际项目目标构建良好,与 AFNetworking 完美配合。

附:我还需要将所有要测试的文件添加到 UnitTest 目标中。那么在构建阶段添加“目标依赖”有什么作用呢?

总之,

    如何在不同目标之间共享公共依赖关系? 如果我仍然必须将每个文件添加到新目标,添加目标依赖项到底有什么作用?

【问题讨论】:

有类似的问题。看起来我们需要一种不导入类的方法,而是添加搜索路径以使其工作...... 我通过链接到 libPod.a 文件解决了这个问题,该文件由主项目的 pod 生成,也在测试目标中......它们看起来完全一样。也许不是正确的方法。但是,我仍然必须将要测试的每个文件添加到两个目标.. =( 【参考方案1】:

通过使用

target :UnitTests, :exclusive => true do
  pod 'GHUnitIOS', '0.5.6'
end

您是说您想要链接到UnitTests 目标的唯一库是GHUnit,主要是说您希望AFNetworking 也被链接。问题是您似乎还将您的 AFHTTPClient 子类导入到 UnitTests 中,在那里找不到它试图链接的 AFNetworking 组件。

要解决此问题,您应该能够删除独占调用

target :UnitTests do
  pod 'GHUnitIOS', '0.5.6'
end

这样,您将仅将GHUnit 链接到您的UnitTests 目标,但会将AFNetworking 链接到两者。 “默认情况下,目标将包括在块之外定义的依赖项,除非给出 :exclusive => true 选项。” (来自here)

【讨论】:

有趣 .. 会得到结果

以上是关于使用 Cocoapods 管理多个目标的依赖关系的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 如何在使用 cocoapods 开发框架期间管理框架的依赖关系?

Cocoapods 停留在“分析依赖关系”上

Cocoapods pod 创建目标并在使用时更改 Xcode 中的目标

为 CocoaPods 的 pod 设置部署目标

Xcode:了解 CocoaPods 的依赖关系

《iOS开发进阶》连载:第2章-使用CocoaPods做依赖管理