Xcode projem için pod dosyamda birden çok hedefi nasıl belirleyebilirim?


143

Xcode 4 projemle CocoaPods kullanıyorum ve projem için üç hedefim var (varsayılan, bir lite sürümü oluşturmak için ve bir demo sürümü oluşturmak için). Tüm hedefler aynı kütüphaneleri kullanır, ancak CocoaPods yalnızca birincil kütüphaneye statik kütüphaneyi ve arama yollarını ekler. Pod dosyam şöyle:

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'

Bunu işe almak için tek yolu, tekrar listelenen tüm bakla ile her hedefi ayrı ayrı belirtmek oldu.

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

Bunu yapmanın daha iyi bir yolu var mı?


Lütfen soyut hedefi okuyun. İhtiyacınız olan şey bu. guides.cocoapods.org/syntax/podfile.html#abstract_target
Nik Kov

Yanıtlar:


340

CocoaPods 1.0 bunun sözdizimini değiştirdi. Şimdi şöyle görünüyor:

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 cevabı:

Evet, daha iyi bir yol var! Birden çok hedef belirlemek için link_withnerede yapabileceğinizi kontrol edin link_with 'MyApp', 'MyOtherApp'.

Bu gibi birim testleri ile kullanın link_with 'App', 'App-Tests'(hedef adlarında boşluk dikkat).

Misal:

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'

2017 güncellemesi

Abstract_target kullanabilirsiniz

# 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

Harika, peki link_with'i ilk örnek pod dosyama nereye koyardınız? Bana bir örnek gösterebilir misin?
Austin

Cevabım güncellendi. Gerçekten önemli değil.
Keith Smiley

4
Aynı şeyi deniyorum, ama benim durumumda, ana hedefin birden fazla hedef bağımlılığına bağlıyorum. Bu, bağlantı aşamasında yinelenen semboller hatası almanıza neden olur. Cocoapod'ları kullanarak bu sorunu nasıl çözeceğinizi biliyor musunuz?
Fergal Rooney

2
Görünüşe göre Hedefler listenizdeki köşeli parantezlere artık gerek yok (ve çalışmıyor mu?). deets: guides.cocoapods.org/syntax/podfile.html#link_with
toblerpwn

2
@KeithSmiley Anlıyorum. Aslında bu alanlarla hala sorun yaşıyorum. Tüm hedeflerimi boşluk bırakmayacak şekilde yeniden adlandırmak zorunda kaldım. Cocoapods'un link_with yerine bir (tüm hedefler için yap) özelliği yoktur.
hishamaus

91

Bence daha iyi bir çözüm

# 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

Referans: http://natashatherobot.com/cocoapods-instal-same-pod-multiple-targets/


1
Bunun neden daha iyi bir çözüm olduğunu açıklar mısınız?
Çözgü

1
@Warpling: Lütfen bu natashatherobot.com/…
Adarsh ​​GJ

9
Bu açıklamanın bir kısmını buraya ekleseniz harika olurdu. (Bağlantılar düştüğünde vb. SO hakkında gerekli tüm bilgileri tutmak güzeldir) Ayrıca insanların sorunu link_withgörmesine ve cevabınızı yükseltmesine yardımcı olabilir :)
Warpling

Tüm yaklaşımlar (available_pods) için kullanılabilir bir grup bakla ve belirli kapsüller hedef çünkü bu yaklaşımı seviyorum.
Apoc

Bu çözüm iyi çalışıyor, ancak bahsetmeye değer bir şey: 'def' değerleriniz küçük harf olmalıdır.
Jerome

9

Aynı bölmeleri paylaşmak için birden fazla hedef istiyorsanız, bir abstract_target kullanın.

# 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

ya da sadece

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

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


2

En kolay yol, belirtilen her kapsülün tüm hedeflerle bağlantılı olacağı soyut bir hedef kullanmaktır.

abstract_target 'someNameForAbstractTarget' do
  pod 'podThatIsForAllTargets'
end

target 'realTarget' do
  pod 'podThatIsOnlyForThisTarget'
end

Onun dışına realTargetçıkmak yerine içeri someNameForAbstractTarget girmemeli mi?
Shubham Bakshi

Diğer cevaplara bakılırsa bu da işe yarayabilir.
Sayag
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.