Come posso specificare più target nel mio podfile per il mio progetto Xcode?


143

Sto usando CocoaPods con il mio progetto Xcode 4 e ho tre obiettivi per il mio progetto (quello predefinito, uno per la creazione di una versione Lite e uno per la costruzione di una versione demo). Tutte le destinazioni utilizzano le stesse librerie, ma CocoaPods sta solo aggiungendo la libreria statica e i percorsi di ricerca alla destinazione principale. Il mio podfile è simile al seguente:

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'

L'unico modo per farlo funzionare era specificare ogni obiettivo individualmente con tutti i pod elencati di nuovo.

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

C'è un modo migliore per farlo?


Per favore, leggi dell'obiettivo astratto. È quello che ti serve. guide.cocoapods.org/syntax/podfile.html#abstract_target
Nik Kov

Risposte:


340

CocoaPods 1.0 ha modificato la sintassi per questo. Ora sembra così:

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

Obsoleti Pre CocoaPods 1.0 risposta:

Sì, c'è un modo migliore! Scopri link_withdove puoi fare link_with 'MyApp', 'MyOtherApp'per specificare più target.

Lo uso con unit test come link_with 'App', 'App-Tests'(attenzione agli spazi nei nomi dei target).

Esempio:

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'

Aggiornamento 2017

Puoi usare 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

Fantastico, quindi dove inseriresti il ​​link_with nel mio primo file di esempio? Puoi mostrarmi un esempio?
Austin,

Aggiornato la mia risposta. Non dovrebbe importare davvero.
Keith Smiley,

4
Sto provando la stessa cosa, ma nel mio caso mi sto collegando a più dipendenze target del target principale. Ciò si traduce in errori di simboli duplicati nella fase di collegamento. Sai come aggirare questo usando Cocoapods?
Fergal Rooney,

2
Sembra che le parentesi attorno al tuo elenco di target non siano più necessarie (e non funzionino?). deets: guide.cocoapods.org/syntax/podfile.html#link_with
toblerpwn

2
@KeithSmiley vedo. In realtà ho avuto ancora problemi con quegli spazi. Ho dovuto rinominare tutti i miei obiettivi per non avere spazi. Fa schifo che Cocoapods non ha (fare per tutti i target) invece di link_with.
Hishamaus,

91

Penso che la soluzione migliore sia

# 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

Riferimento da: http://natashatherobot.com/cocoapods-installing-same-pod-multiple-targets/


1
Ti dispiace spiegare perché questa è una soluzione migliore?
Warpling

1
@Warpling: Ti preghiamo di consultare questo natashatherobot.com/…
Adarsh ​​GJ il

9
Sarebbe bello se tu aggiungessi un po 'di quella spiegazione qui. (È bello mantenere tutte le informazioni necessarie su SO nel caso in cui i collegamenti si interrompano, ecc.) Potrebbe anche aiutare le persone a vedere il problema link_withe a votare la tua risposta :)
Warpling

Mi piace questo approccio perché consente a un sacco di pod disponibili per tutti i target (available_pods) e target specifici.
Apoc

Questa soluzione funziona bene, ma qualcosa che vale la pena menzionare: i valori 'def' devono essere minuscoli.
Girolamo

9

Se vuoi che più target condividano gli stessi pod, usa un 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

o solo

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

fonte: https://guides.cocoapods.org/using/the-podfile.html


2

Il modo più semplice è utilizzare un obiettivo astratto, in cui ciascun pod specificato verrà collegato a tutti i target.

abstract_target 'someNameForAbstractTarget' do
  pod 'podThatIsForAllTargets'
end

target 'realTarget' do
  pod 'podThatIsOnlyForThisTarget'
end

Non dovrebbe realTargetandare dentro someNameForAbstractTarget piuttosto che fuori?
Shubham Bakshi il

A giudicare dalle altre risposte, potrebbe funzionare anche in questo modo.
Agitato Sayag il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.