CocoaPods 向 Tests 项目添加重复的框架

Posted

技术标签:

【中文标题】CocoaPods 向 Tests 项目添加重复的框架【英文标题】:CocoaPods adding duplicate frameworks to Tests project 【发布时间】:2014-03-05 19:46:11 【问题描述】:

我有一个工作区,其中包含一个项目 (MyProject) 和三个目标(MyProject、MyProjectTests 和 MyProjectPlugin)。我为它设置了一个包含三个依赖项的 Podfile。前两个应该链接到所有三个目标,但第三个(OCMock)应该只链接到我的测试目标。这是我的 Podfile:

platform :osx, '10.8'

pod 'objective-zip', :podspec => 'Podspecs/objective-zip.podspec'
link_with 'MyProject', 'MyProjectPlugin', 'MyProjectTests'

pod 'Unrar4ios', :path => '../Unrar4iOS'
link_with 'MyProject', 'MyProjectPlugin', 'MyProjectTests'

target : MyProjectTests do
    pod 'OCMock', '~> 2.2.3'
end

我希望libPods.a 只包含objective-zipUnrar4iOS,而libPods-MyProjectTests.a 是一个超集,包含这两个和OCMock。事实上,情况就是这样,我通过查看 Pods.xcodeproj 中设置的目标来验证这一点。因此,将这些框架链接到我的项目的正确方法是主要插件项目使用libPods.a,测试项目使用libPods-MyProjectTests.a。当我以这种方式配置项目时,一切都编译并运行良好。

这就是问题所在。每当我 pod update 使用新的依赖项时,libPods.a 就会链接到 libPods-MyProjectTests.a 之上的 MyProjectTests,这会导致编译器错误(ld 报告重复符号,正如预期的那样)。

这是 CocoaPods 的错误,还是我需要更新我的 Podfile。这在本地开发时很麻烦,但是当我配置一个每次都会pod install 的自动构建时,这将是一个主要问题(因为我不打算也不打算提交 Pods 目录)。

【问题讨论】:

【参考方案1】:

我仍在寻找正确的答案(或者我做错了什么,或者 CocoaPods 中存在错误),但我想出了这个解决方法。我用一个 Ruby 脚本包装了pod install,该脚本使用 Xcodeproj 从我的测试项目中删除冗余库:

#!/usr/bin/env ruby

require 'rubygems'

gem 'xcodeproj'
require 'xcodeproj'

puts `pod install`

puts 'Removing extra linked library'
main_project = Xcodeproj::Project.open('Comickaze.xcodeproj')
tests_target = main_project.targets.find|target| target.name == 'ComickazeTests'

framework_to_remove = tests_target.frameworks_build_phase.files.find|file| file.display_name == 'libPods.a'
tests_target.frameworks_build_phase.remove_file_reference(framework_to_remove.file_ref)

main_project.save

我不会接受这个答案,因为必须有更好的方法。

【讨论】:

以上是关于CocoaPods 向 Tests 项目添加重复的框架的主要内容,如果未能解决你的问题,请参考以下文章

每个 Cocoapods 构建目标的含义

Firebase CocoaPods 出现重复符号链接器错误

CocoaPods的安装和使用

CocoaPods安装步骤

最新版 CocoaPods 的安装流程

如何从 Cocoapods Xcode 7 中删除单个框架 [重复]