为具有多个目标和不同平台的项目编写Podfile

我正在准备一个支持OS X和iOS的Pod。 我的pod有自己的一些依赖关系,这些依赖关系是在podspec文件中定义的,所以我使用Podfile来pipe理我用来开发pod和运行testing的项目的依赖关系。 我正在使用CocoaPods 0.33.1。

我有四个目标:

  • MFDynamic.iOS (iOS静态库)
  • MFDynamic.iOS.Tests (iOStesting包)
  • MFDynamic.Mac (Mac框架)
  • MFDynamic.Mac.Tests (Mactesting包)

我想要的行为是这样的:

  • 指定每个目标的平台(因为有iOS和OS X目标)。
  • 在非testing目标中包含podspec依赖关系作为窗格。
  • 能够指定Kiwi/XCTest作为我的testing目标的依赖项。

但是,无论我尝试过多less次,我都无法编写一个可用的Podfile。 运行pod install永远不会将CocoaPods的构build阶段添加到我的目标中,也不会将相应的xcconfig文件添加到项目中。 CocoaPods不会警告Podfile中的任何错误。

这是我最近失败的尝试:

 target 'MFDynamic.iOS' do platform :ios, '6.1' podspec :path => '../MFDynamic.podspec' end target 'MFDynamic.Mac' do platform :osx, '10.7' podspec :path => '../MFDynamic.podspec' end target 'MFDynamic.iOS.Tests' do platform :ios, '6.1' pod 'Kiwi/XCTest', '~> 2.2.4' end target 'MFDynamic.Mac.Tests' do platform :osx, '10.7' pod 'Kiwi/XCTest', '~> 2.2.4' end 

简化一点产生相同的结果(即没有项目中的集成):

 target 'MFDynamic.iOS' do platform :ios, '6.1' pod 'AFNetworking', '~> 2.2' end target 'MFDynamic.Mac' do platform :osx, '10.7' pod 'AFNetworking', '~> 2.2' end 

我甚至会考虑把所有的目标链接到所有的目标上,最后当项目通过CocoaPods被包含在别人的工作中时,它只会抓取合适的源文件。 所以即使这样说,Kiwi链接到iOS静态库目标,当与CocoaPods集成时,它不会被拖拽到用户的项目中。 我真的想避免这种做法,但如果这是唯一的方法…

无论如何,用这种思维方式,我尝试了以下几点,没有太多的运气:

 link_with 'MFDynamic.iOS', 'MFDynamic.Mac', 'MFDynamic.iOS.Tests', 'MFDynamic.Mac.Tests' podspec :path => '../MFDynamic.podspec' pod 'Kiwi', '~> 2.2' 

在这种情况下,我得到一个pod install错误:

 NoMethodError - undefined method `include?' for nil:NilClass /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/xcodeproj-0.17.0/lib/xcodeproj/project/object/native_target.rb:95:in `platform_name' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/cocoapods-0.33.1/lib/cocoapods/installer/analyzer.rb:471:in `block in compute_platform_for_target_definition' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/cocoapods-0.33.1/lib/cocoapods/installer/analyzer.rb:469:in `each' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/cocoapods-0.33.1/lib/cocoapods/installer/analyzer.rb:469:in `compute_platform_for_target_definition' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/cocoapods-0.33.1/lib/cocoapods/installer/analyzer.rb:519:in `block in compute_target_platforms' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/cocoapods-0.33.1/lib/cocoapods/installer/analyzer.rb:514:in `each' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/cocoapods-0.33.1/lib/cocoapods/installer/analyzer.rb:514:in `compute_target_platforms' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/cocoapods-0.33.1/lib/cocoapods/installer/analyzer.rb:55:in `analyze' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/cocoapods-0.33.1/lib/cocoapods/installer.rb:176:in `analyze' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/cocoapods-0.33.1/lib/cocoapods/installer.rb:98:in `block in resolve_dependencies' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/cocoapods-0.33.1/lib/cocoapods/user_interface.rb:52:in `section' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/cocoapods-0.33.1/lib/cocoapods/installer.rb:97:in `resolve_dependencies' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/cocoapods-0.33.1/lib/cocoapods/installer.rb:89:in `install!' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/cocoapods-0.33.1/lib/cocoapods/command/project.rb:40:in `run_install_with_update' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/cocoapods-0.33.1/lib/cocoapods/command/project.rb:70:in `run' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/claide-0.6.1/lib/claide/command.rb:281:in `run' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/cocoapods-0.33.1/lib/cocoapods/command.rb:48:in `run' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/gems/cocoapods-0.33.1/bin/pod:33:in `<top (required)>' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/bin/pod:23:in `load' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/bin/pod:23:in `<main>' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/bin/ruby_executable_hooks:15:in `eval' /Users/Michael/.rvm/gems/ruby-2.0.0-p0/bin/ruby_executable_hooks:15:in `<main>' 

我的问题:

什么是正确的做法,我想做什么(见上文)? 我怎样才能让CocoaPods成功集成到我的项目和iOS / Mac的目标? 我已经细读了Podfile文档,但发现它缺乏这方面的内容。

得到它了! 这不是由于我认为的Podfile语法的误用造成的。

相反,这是因为我已经手动清理了所有与CocoaPods相关的东西的构build阶段来执行一个干净的pod install (不要问为什么)。

在看了CocoaPods源代码之后 ,我注意到当在目标的“Link Binary With Libraries”构build阶段中存在pods静态库时,将跳过对目标的集成 。 哎呦!

从我的每个目标中删除libPods-xxxx.a文件并再次运行pod install执行集成到我的目标中。