我有一个工作区,包含一个项目(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-zip
和Unrar4iOS
,而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>
答案 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
我不接受这个答案,因为必须有更好的方法。