Написание подфайла для проекта с несколькими целями и различными платформами

Я готовлю модуль, поддерживающий OS X и iOS. Мой блок имеет некоторые собственные зависимости, которые определены в файле podspec, поэтому я использую Podfile для управления зависимостями проекта, которые я использую, для разработки модуля и запуска тестов. Я использую CocoaPods 0.33.1.

У меня есть четыре цели:

  • MFDynamic.iOS (статическая библиотека iOS)
  • MFDynamic.iOS.Tests (тестовый комплект iOS)
  • MFDynamic.Mac (среда Mac)
  • MFDynamic.Mac.Tests (комплект для тестирования Mac)

Поведение, которое я хочу, следующее:

  • Укажите платформу на цель (так как есть цели iOS и OS X).
  • Включите зависимости podspec в виде контейнеров в не-тестовых целях.
  • Возможность указать Kiwi/XCTest как зависимость только для моих тестовых целей.

Однако я не смог написать подфайл, который работает, независимо от того, что я пробовал. Запуск pod install никогда не добавляет фазы сборки CocoaPods к моим целям и не добавляет соответствующие xcconfig файлов в проект. CocoaPods не выдает предупреждения о том, что что-то не так в подфайле.

Вот моя недавняя неудачная попытка:

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? Я просмотрел документацию по подписям, но обнаружил, что в этом нет недостатка.

Ответ 1

Получил! Это не было вызвано неправильным использованием синтаксиса Podfile, как я думал.

Скорее, это было связано с тем, что я вручную очистил фазы сборки всех связанных с CocoaPods вещей, чтобы выполнить чистую pod install (не спрашивайте почему).

Посмотрев исходный код CocoaPods, я заметил, что интеграция в цель пропускается, когда статическая библиотека pods присутствовать в фазе компоновки ссылок с бинарными связями. Упс!

Удаление файлов libPods-xxxx.a из каждой из моих целей и запуск pod install снова выполнило интеграцию в мои цели.