Jak określić wiele celów w moim pliku podfile dla mojego projektu Xcode?

142

Używam CocoaPods z moim projektem Xcode 4 i mam trzy cele dla mojego projektu (domyślny, jeden do tworzenia wersji lite i jeden do tworzenia wersji demonstracyjnej). Wszystkie cele używają tych samych bibliotek, ale CocoaPods dodaje tylko bibliotekę statyczną i ścieżki wyszukiwania do głównego celu. Mój plik podfile wygląda następująco:

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'

Jedynym sposobem, w jaki udało mi się to uruchomić, było określenie każdego celu osobno ze wszystkimi wymienionymi kapsułkami.

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

Czy jest lepszy sposób, aby to zrobić?

Austin
źródło
Przeczytaj o abstrakcyjnym celu. To jest to, czego potrzebujesz. guide.cocoapods.org/syntax/podfile.html#abstract_target
Nik

Odpowiedzi:

339

CocoaPods 1.0 zmieniła składnię tego. Teraz wygląda to tak:

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

Nieaktualne Pre CocoaPods 1,0 odpowiedź:

Tak, jest lepszy sposób! Sprawdź, link_withgdzie możesz link_with 'MyApp', 'MyOtherApp'określić wiele celów.

Używam tego z testami jednostkowymi, takimi jak link_with 'App', 'App-Tests'(uwaga na spacje w nazwach celów).

Przykład:

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'

Aktualizacja 2017

Możesz użyć 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
Keith Smiley
źródło
Świetnie, więc gdzie umieściłbyś link_with w moim pierwszym przykładowym pliku podfile? Czy możesz pokazać mi przykład?
Austin
Zaktualizowałem moją odpowiedź. To nie powinno mieć znaczenia.
Keith Smiley
4
Próbuję tego samego, ale w moim przypadku łączę się z wieloma zależnościami docelowymi głównego celu. Powoduje to wystąpienie błędu zduplikowanych symboli w fazie łączenia. Czy wiesz, jak obejść to za pomocą Cocoapods?
Fergal Rooney
2
Wygląda na to, że nawiasy wokół listy celów nie są już potrzebne (i nie działają?). deets: guide.cocoapods.org/syntax/podfile.html#link_with
toblerpwn
2
@KeithSmiley Widzę. Właściwie nadal mam problemy z tymi przestrzeniami. Musiałem zmienić nazwy wszystkich moich celów, aby nie miały spacji. Do bani, że Cocoapods nie ma (do dla wszystkich celów) zamiast link_with.
hishamaus
91

Myślę, że lepszym rozwiązaniem jest

# 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

Źródła: http://natashatherobot.com/cocoapods-installing-same-pod-multiple-targets/

Adarsh ​​GJ
źródło
1
Czy możesz wyjaśnić, dlaczego jest to lepsze rozwiązanie?
Warpling
1
@Warpling: Proszę przejść przez ten natashatherobot.com/ ...
Adarsh ​​GJ
9
Byłoby wspaniale, gdybyś dodał tutaj trochę tego wyjaśnienia. (Fajnie jest zachować wszystkie niezbędne informacje w SO na wypadek, gdyby linki zostały link_withzerwane itp.) Może to również pomóc ludziom zobaczyć problem i zagłosować na twoją odpowiedź :)
Warpling
Podoba mi się to podejście, ponieważ umożliwia dostęp do kilku podów dla wszystkich celów (available_pods) i określonych podów.
Apoc
To rozwiązanie działa dobrze, ale warto o tym wspomnieć: wartości „def” muszą być zapisane małymi literami.
Jerome,
9

Jeśli chcesz, aby wiele celów współdzieliło te same pody, użyj 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

Lub tylko

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

źródło: https://guides.cocoapods.org/using/the-podfile.html

Adam Smaka
źródło
2

Najłatwiejszym sposobem jest użycie abstrakcyjnego celu, w którym każdy określony pod będzie połączony ze wszystkimi celami.

abstract_target 'someNameForAbstractTarget' do
  pod 'podThatIsForAllTargets'
end

target 'realTarget' do
  pod 'podThatIsOnlyForThisTarget'
end
Shaked Sayag
źródło
Czy nie powinno realTargetwejść raczej do środka someNameForAbstractTarget niż na zewnątrz?
Shubham Bakshi
Sądząc po innych odpowiedziach, to też może działać w ten sposób.
Shaked Sayag