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

时间:2014-03-05 19:46:11

标签: objective-c xcode shared-libraries cocoapods

我有一个工作区,包含一个项目(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报告重复的符号,如预期的那样)。< / p>

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

1 个答案:

答案 0 :(得分:0)

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

#!/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

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