Comment spécifier plusieurs cibles dans mon podfile pour mon projet Xcode?

143

J'utilise CocoaPods avec mon projet Xcode 4 et j'ai trois cibles pour mon projet (la valeur par défaut, une pour créer une version allégée et une pour créer une version de démonstration). Toutes les cibles utilisent les mêmes bibliothèques, mais CocoaPods ajoute uniquement la bibliothèque statique et les chemins de recherche à la cible principale. Mon podfile ressemble à ceci:

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'

Le seul moyen pour que cela fonctionne était de spécifier chaque cible individuellement avec tous les pods répertoriés à nouveau.

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

Y a-t-il une meilleure manière de faire cela?

Austin
la source
Veuillez lire sur la cible abstraite. C'est ce dont vous avez besoin. guides.cocoapods.org/syntax/podfile.html#abstract_target
Nik Kov

Réponses:

340

CocoaPods 1.0 a changé la syntaxe pour cela. Cela ressemble maintenant à ceci:

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

Outdated Pre CocoaPods 1.0 réponse:

Oui, il y a un meilleur moyen! Découvrez link_withoù vous pouvez faire link_with 'MyApp', 'MyOtherApp'pour spécifier plusieurs cibles.

J'utilise ceci avec des tests unitaires comme link_with 'App', 'App-Tests'(attention aux espaces dans les noms des cibles).

Exemple:

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'

Mise à jour 2017

Vous pouvez utiliser 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
la source
Super, alors où mettriez-vous le link_with dans mon premier exemple de podfile? Pouvez-vous me montrer un exemple?
Austin
J'ai mis à jour ma réponse. Cela ne devrait pas vraiment avoir d'importance.
Keith Smiley
4
J'essaye la même chose, mais dans mon cas, je suis lié à plusieurs dépendances cibles de la cible principale. Cela entraîne une erreur de symboles en double dans la phase de liaison. Savez-vous comment contourner cela en utilisant des Cocoapods?
Fergal Rooney
2
On dirait que les crochets autour de votre liste de cibles ne sont plus nécessaires (et ne fonctionnent pas?). deets: guides.cocoapods.org/syntax/podfile.html#link_with
toblerpwn
2
@KeithSmiley je vois. J'ai encore des problèmes avec ces espaces, en fait. J'ai dû renommer toutes mes cibles pour ne pas avoir d'espace. Sucks que Cocoapods n'a pas de (faire pour toutes les cibles) au lieu de link_with.
hishamaus
91

Je pense qu'une meilleure solution est

# 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éférence de: http://natashatherobot.com/cocoapods-installing-same-pod-multiple-targets/

Adarsh ​​GJ
la source
1
Cela vous dérange-t-il d'expliquer pourquoi c'est une meilleure solution?
Warpling
1
@Warpling: Veuillez consulter ce natashatherobot.com
Adarsh ​​GJ
9
Ce serait formidable si vous ajoutiez un peu de cette explication ici. (C'est bien de garder toutes les informations nécessaires sur SO au cas où les liens tomberaient en panne, etc.) Cela pourrait également aider les gens à voir le problème link_withet à voter pour votre réponse :)
Warpling
J'aime cette approche car elle permet à un tas de pods disponibles pour toutes les cibles (available_pods) et cible des pods spécifiques.
Apoc
Cette solution fonctionne bien, mais quelque chose qui mérite d'être mentionné: vos valeurs «def» doivent être en minuscules.
Jerome
9

Si vous souhaitez que plusieurs cibles partagent les mêmes pods, utilisez 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

ou juste

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

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

Adam Smaka
la source
2

Le moyen le plus simple consiste à utiliser une cible abstraite, où chaque pod spécifié sera lié à toutes les cibles.

abstract_target 'someNameForAbstractTarget' do
  pod 'podThatIsForAllTargets'
end

target 'realTarget' do
  pod 'podThatIsOnlyForThisTarget'
end
Shaked Sayag
la source
Ne devrait-il pas realTargetaller à l' intérieur someNameForAbstractTarget plutôt qu'à l'extérieur?
Shubham Bakshi
À en juger par les autres réponses, cela pourrait également fonctionner de cette façon.
Shaked Sayag