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ć?


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

Ś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/


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


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.