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-zip
和Unrar4iOS
,而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 项目添加重复的框架的主要内容,如果未能解决你的问题,请参考以下文章