Як вказати кілька цілей у своєму підфілі для мого проекту Xcode?


142

Я використовую 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#ab абстракт_target
Nik Kov

Відповіді:


339

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

ЗАВЕРШЕНО попередньо відповідь 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

Чудово, тож де б ви помістили link_with у моєму першому прикладі підфільму? Чи можете ви показати мені приклад?
Остін

Оновлено мою відповідь. Це насправді не має значення.
Кіт Смілі

4
Я намагаюсь те саме, але в моєму випадку я пов'язую декілька цільових залежностей від основної цілі. Це призводить до отримання помилок повторюваних символів у фазі зв’язування. Чи знаєте ви, як обійти це за допомогою Cocoapods?
Fergal Rooney

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-installing-same-pod-multiple-targets/


1
Ви не проти пояснити, чому це краще рішення?
Warpling

1
@Warpling: Будь ласка, перегляньте цей natashatherobot.com/…
Adarsh ​​GJ

9
Було б чудово, якби ви додали сюди трохи пояснення. (Приємно зберігати всю інформацію, необхідну на ТАК, у випадку, якщо посилання link_withзнизяться тощо). Це також може допомогти людям побачити проблему та підтвердити вашу відповідь :)
Warpling

Мені подобається такий підхід, тому що він дозволяє купу стручків, доступних для всіх цілей (available_pods) та націлювати конкретні стручки.
Апок

Це рішення працює чудово, але щось, що варто згадати: значення 'def' мають бути малими літерами.
Ієронім

9

Якщо ви хочете, щоб декілька цілей ділилися однаковими стручками, використовуйте абстрактний_ціль.

# 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 а не зовні?
Shubham Bakshi

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