Как мне указать несколько целей в моем подфайле для моего проекта XCode?

143

Я использую CocoaPods с моим проектом Xcode 4, и у меня есть три цели для моего проекта (по умолчанию, одна для создания облегченной версии и одна для создания демонстрационной версии). Все цели используют одни и те же библиотеки, но CocoaPods только добавляет статическую библиотеку и пути поиска к основной цели. Мой подфайл выглядит так:

platform :ios, '5.0'

pod 'TestFlightSDK', '>= 1.1'
pod 'MBProgressHUD', '0.5'
pod 'iRate', '>= 1.6.2'
pod 'TimesSquare', '1.0.1'
pod 'AFNetworking', '1.1.0'
pod 'KKPasscodeLock', '0.1.5'
pod 'iCarousel', '1.7.4'

Единственный способ заставить меня работать с этим состоял в том, чтобы указать каждую цель отдельно со всеми перечисленными модулями.

platform :ios, '5.0'

target :default do  
    pod 'TestFlightSDK', '>= 1.1'
    pod 'MBProgressHUD', '0.5'
    pod 'iRate', '>= 1.6.2'
    pod 'TimesSquare', '1.0.1'
    pod 'AFNetworking', '1.1.0'
    pod 'KKPasscodeLock', '0.1.5'
    pod 'iCarousel', '1.7.4'
end

target :lite do 
    link_with 'app-lite'

    pod 'TestFlightSDK', '>= 1.1'
    pod 'MBProgressHUD', '0.5'
    pod 'iRate', '>= 1.6.2'
    pod 'TimesSquare', '1.0.1'
    pod 'AFNetworking', '1.1.0'
    pod 'KKPasscodeLock', '0.1.5'
    pod 'iCarousel', '1.7.4'
end

target :demo do 
    link_with 'app-demo'

    pod 'TestFlightSDK', '>= 1.1'
    pod 'MBProgressHUD', '0.5'
    pod 'iRate', '>= 1.6.2'
    pod 'TimesSquare', '1.0.1'
    pod 'AFNetworking', '1.1.0'
    pod 'KKPasscodeLock', '0.1.5'
    pod 'iCarousel', '1.7.4'
end

Есть лучший способ сделать это?

Остин
источник
Пожалуйста, прочитайте об абстрактной цели. Это то, что вам нужно. guides.cocoapods.org/syntax/podfile.html#abstract_target
Ник Ков

Ответы:

340

CocoaPods 1.0 изменил синтаксис для этого. Теперь это выглядит так:

def shared_pods
    pod 'SSKeychain', '~> 0.1.4'
    pod 'INAppStoreWindow', :head
    pod 'AFNetworking', '1.1.0'
    pod 'Reachability', '~> 3.1.0'
    pod 'KSADNTwitterFormatter', '~> 0.1.0'
    pod 'MASShortcut', '~> 1.1'
    pod 'MagicalRecord', '2.1'
    pod 'MASPreferences', '~> 1.0'
end

target 'Sail' do
    shared_pods
end

target 'Sail-iOS' do
    shared_pods
end

УСТАРЕЛО Pre CocoaPods 1.0 ответ:

Да, есть лучший способ! Проверьте, link_withгде вы можете link_with 'MyApp', 'MyOtherApp'указать несколько целей.

Я использую это с подобными тестами link_with 'App', 'App-Tests'(остерегайтесь пробелов в именах целей).

Пример:

platform :osx, '10.8'

link_with 'Sail', 'Sail-Tests'

pod 'SSKeychain', '~> 0.1.4'
pod 'INAppStoreWindow', :head
pod 'AFNetworking', '1.1.0'
pod 'Reachability', '~> 3.1.0'
pod 'KSADNTwitterFormatter', '~> 0.1.0'
pod 'MASShortcut', '~> 1.1'
pod 'MagicalRecord', '2.1'
pod 'MASPreferences', '~> 1.0'

Обновление 2017

Вы можете использовать abstract_target

# Note: There are no targets called "Shows" in any of this workspace's Xcode projects
abstract_target 'Shows' do
  pod 'ShowsKit'

  # The target ShowsiOS has its own copy of ShowsKit (inherited) + ShowWebAuth (added here)
  target 'ShowsiOS' do
    pod 'ShowWebAuth'
  end

  # The target ShowsTV has its own copy of ShowsKit (inherited) + ShowTVAuth (added here)
  target 'ShowsTV' do
    pod 'ShowTVAuth'
  end

  # Our tests target has its own copy of
  # our testing frameworks, and has access
  # to ShowsKit as well because it is
  # a child of the abstract target 'Shows'

  target 'ShowsTests' do
    inherit! :search_paths
    pod 'Specta'
    pod 'Expecta'
  end
end
Кит Смайли
источник
Отлично, где бы вы поместили ссылку на мой первый подфайл примера? Можете ли вы показать мне пример?
Остин
Обновил мой ответ. Это не должно иметь большого значения.
Кит Смайли
4
Я пытаюсь сделать то же самое, но в моем случае я ссылаюсь на несколько целевых зависимостей основной цели. Это приводит к получению ошибки повторяющихся символов в фазе связывания. Вы знаете, как обойти это, используя Cocoapods?
Фергал Руни
2
Похоже, скобки вокруг списка целей больше не нужны (и не работают?). deets: guides.cocoapods.org/syntax/podfile.html#link_with
toblerpwn
2
@KeithSmiley, я вижу. У меня были проблемы с этими местами, на самом деле. Мне пришлось переименовать все мои цели, чтобы не было пробелов. Отстой, что у Cocoapods нет (сделать для всех целей) вместо link_with.
hishamaus
91

Я думаю, что лучшее решение

# Podfile

platform :ios, '8.0'

use_frameworks!

# Available pods

def available_pods
    pod 'AFNetworking', '1.1.0'
    pod 'Reachability', '~> 3.1.0'
end

target 'demo' do
  available_pods
end

target 'demoTests' do
    available_pods
end

Ссылка от: http://natashatherobot.com/cocoapods-install-same-pod-multiple-targets/

Адарш Г.Дж.
источник
1
Не могли бы вы объяснить, почему это лучшее решение?
Деформация
1
@Warpling: Пожалуйста, пройдите этот natashatherobot.com/…
Adarsh ​​GJ
9
Было бы здорово, если бы вы добавили немного этого объяснения здесь. (Приятно хранить всю информацию, необходимую для SO, в случае, если ссылки не link_withработают и т. Д.) Это также может помочь людям увидеть проблему и ответить на ваш ответ :)
Деформация
Мне нравится этот подход, потому что он позволяет связку пакетов, доступных для всех целей (available_pods) и целевых пакетов.
Апок
Это решение прекрасно работает, но кое-что стоит упомянуть: ваши значения 'def' должны быть в нижнем регистре.
Джером
9

Если вы хотите, чтобы несколько целей использовали одни и те же модули, используйте abstract_target.

# There are no targets called "Shows" in any Xcode projects
abstract_target 'Shows' do
  pod 'ShowsKit'
  pod 'Fabric'

  # Has its own copy of ShowsKit + ShowWebAuth
  target 'ShowsiOS' do
    pod 'ShowWebAuth'
  end

  # Has its own copy of ShowsKit + ShowTVAuth
  target 'ShowsTV' do
    pod 'ShowTVAuth'
  end
end

или просто

pod 'ShowsKit'
pod 'Fabric'

# Has its own copy of ShowsKit + ShowWebAuth
target 'ShowsiOS' do
  pod 'ShowWebAuth'
end

# Has its own copy of ShowsKit + ShowTVAuth
target 'ShowsTV' do
  pod 'ShowTVAuth'
end

источник: https://guides.cocoapods.org/using/the-podfile.html

Адам Смака
источник
2

Самый простой способ - использовать абстрактную цель, где каждый указанный модуль будет связан со всеми целями.

abstract_target 'someNameForAbstractTarget' do
  pod 'podThatIsForAllTargets'
end

target 'realTarget' do
  pod 'podThatIsOnlyForThisTarget'
end
Shaked Sayag
источник
Не должен ли realTargetидти внутрь, someNameForAbstractTarget а не снаружи?
Шубхам Бакши
Судя по другим ответам, это тоже может сработать.
встряхнул Саяг