Wie gebe ich in meiner Poddatei mehrere Ziele für mein Xcode-Projekt an?

142

Ich verwende CocoaPods mit meinem Xcode 4-Projekt und habe drei Ziele für mein Projekt (das Standardziel, eines zum Erstellen einer Lite-Version und eines zum Erstellen einer Demoversion). Alle Ziele verwenden dieselben Bibliotheken, aber CocoaPods fügt dem primären Ziel nur die statische Bibliothek und die Suchpfade hinzu. Mein Podfile sieht folgendermaßen aus:

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'

Die einzige Möglichkeit, dies zum Laufen zu bringen, bestand darin, jedes Ziel einzeln mit allen erneut aufgelisteten Pods anzugeben.

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

Gibt es einen besseren Weg, dies zu tun?

Austin
quelle
Bitte lesen Sie über abstraktes Ziel. Es ist was du brauchst. guides.cocoapods.org/syntax/podfile.html#abstract_target
Nik Kov

Antworten:

339

CocoaPods 1.0 hat die Syntax dafür geändert. Es sieht jetzt so aus:

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 Antwort:

Ja, es gibt einen besseren Weg! Überprüfen Sie, link_withwo Sie link_with 'MyApp', 'MyOtherApp'mehrere Ziele angeben können.

Ich benutze dies mit Unit-Tests wie link_with 'App', 'App-Tests'(Vorsicht vor Leerzeichen in den Namen der Ziele).

Beispiel:

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'

Update 2017

Sie können abstract_target verwenden

# 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
quelle
Großartig, wo würdest du den link_with in meine erste Beispiel-Poddatei einfügen? Können Sie mir ein Beispiel zeigen?
Austin
Meine Antwort wurde aktualisiert. Es sollte eigentlich keine Rolle spielen.
Keith Smiley
4
Ich versuche das Gleiche, aber in meinem Fall verknüpfe ich mehrere Zielabhängigkeiten des Hauptziels. Dies führt dazu, dass in der Verknüpfungsphase ein Fehler mit doppelten Symbolen auftritt. Wissen Sie, wie Sie dies mit Cocoapods umgehen können?
Fergal Rooney
2
Es sieht so aus, als würden die Klammern um Ihre Zielliste nicht mehr benötigt (und funktionieren nicht?). deets: guide.cocoapods.org/syntax/podfile.html#link_with
toblerpwn
2
@ KeithSmiley Ich verstehe. Eigentlich habe ich immer noch Probleme mit diesen Räumen. Ich musste alle meine Ziele umbenennen, um keine Leerzeichen zu haben. Scheiße, dass Cocoapods nicht ein (do für alle Ziele) anstelle von link_with haben.
Hishamaus
91

Ich denke, eine bessere Lösung ist

# 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

Referenz von: http://natashatherobot.com/cocoapods-installing-same-pod-multiple-targets/

Adarsh ​​GJ
quelle
1
Haben Sie etwas dagegen zu erklären, warum dies eine bessere Lösung ist?
Warpling
1
@ Warpling: Bitte gehen Sie durch diese natashatherobot.com/…
Adarsh ​​GJ
9
Es wäre großartig, wenn Sie hier ein wenig von dieser Erklärung hinzufügen würden. (Es ist schön, alle notwendigen Informationen über SO zu behalten, falls Links link_withausfallen usw.) Es könnte auch den Leuten helfen, das Problem zu erkennen und Ihre Antwort zu
verbessern
Ich mag diesen Ansatz, weil er eine Reihe von Pods ermöglicht, die für alle Ziele (available_pods) und zielspezifische Pods verfügbar sind.
Apoc
Diese Lösung funktioniert gut, aber etwas, das es wert ist, erwähnt zu werden: Ihre 'def'-Werte müssen klein geschrieben sein.
Jerome
9

Wenn Sie möchten, dass mehrere Ziele dieselben Pods gemeinsam nutzen, verwenden Sie ein 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

oder nur

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

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

Adam Smaka
quelle
2

Am einfachsten ist es, ein abstraktes Ziel zu verwenden, bei dem jeder angegebene Pod mit allen Zielen verknüpft wird.

abstract_target 'someNameForAbstractTarget' do
  pod 'podThatIsForAllTargets'
end

target 'realTarget' do
  pod 'podThatIsOnlyForThisTarget'
end
Shaked Sayag
quelle
Sollte das realTargetnicht eher drinnen someNameForAbstractTarget als draußen gehen ?
Shubham Bakshi
Nach den anderen Antworten zu urteilen, könnte es auch so funktionieren.
Shaked Sayag