Как мне указать несколько целей в моем подфайле для моего проекта 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

Не должен ли realTargetидти внутрь, someNameForAbstractTarget а не снаружи?
— Шубхам Бакши

Судя по другим ответам, это тоже может сработать.
— встряхнул Саяг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.