Bagaimana cara menentukan beberapa target di podfile saya untuk proyek Xcode saya?

143

Saya menggunakan CocoaPods dengan proyek Xcode 4 saya dan saya memiliki tiga target untuk proyek saya (default, satu untuk membangun versi lite dan satu untuk membangun versi demo). Semua target menggunakan pustaka yang sama, tetapi CocoaPods hanya menambahkan pustaka statis dan jalur pencarian ke target utama. Podfile saya terlihat seperti ini:

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'

Satu-satunya cara saya membuat ini berfungsi adalah menentukan setiap target secara individual dengan semua pod terdaftar lagi.

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

Apakah ada cara yang lebih baik untuk melakukan ini?

Austin
sumber
Tolong, baca tentang target abstrak. Itu yang kamu butuhkan. guides.cocoapods.org/syntax/podfile.html#abstract_target
Nik Kov

Jawaban:

340

CocoaPods 1.0 telah mengubah sintaks untuk ini. Sekarang terlihat seperti ini:

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

Usang Pre CocoaPods 1,0 jawabannya:

Ya ada cara yang lebih baik! Lihat di link_withmana Anda dapat melakukan link_with 'MyApp', 'MyOtherApp'untuk menentukan beberapa target.

Saya menggunakan ini dengan tes unit seperti link_with 'App', 'App-Tests'(waspadalah terhadap ruang dalam nama target).

Contoh:

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'

Pembaruan 2017

Anda dapat menggunakan 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
sumber
Hebat, jadi di mana Anda meletakkan link_with di contoh pertama saya podfile? Bisakah Anda tunjukkan saya contoh?
Austin
Memperbarui jawaban saya. Seharusnya tidak terlalu penting.
Keith Smiley
4
Saya mencoba hal yang sama, tetapi dalam kasus saya, saya menghubungkan ke beberapa dependensi target dari target utama. Ini menghasilkan kesalahan simbol duplikat pada fase penautan. Apakah Anda tahu cara menyiasatinya dengan menggunakan Cocoapods?
Fergal Rooney
2
Sepertinya tanda kurung di sekitar daftar Target tidak lagi diperlukan (dan tidak berfungsi?). deets: guides.cocoapods.org/syntax/podfile.html#link_with
toblerpwn
2
@KeithSmiley saya mengerti. Sebenarnya saya masih mengalami masalah dengan ruang-ruang itu. Saya harus mengganti nama semua target saya agar tidak memiliki spasi. Menyebalkan bahwa Cocoapods tidak memiliki (lakukan untuk semua target) alih-alih link_with.
hishamaus
91

Saya pikir solusi yang lebih baik adalah

# 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

Referensi dari: http://natashatherobot.com/cocoapods-installing-same-pod-multiple-targets/

Adarsh ​​GJ
sumber
1
Apakah Anda keberatan menjelaskan mengapa ini adalah solusi yang lebih baik?
Warpling
1
@Warpling: Silakan kunjungi natashatherobot.com/…
Adarsh ​​GJ
9
Akan lebih bagus jika Anda menambahkan sedikit penjelasan di sini. (Sangat menyenangkan untuk menyimpan semua informasi yang diperlukan pada SO jika link_with
tautannya
Saya suka pendekatan ini karena memungkinkan banyak pod tersedia untuk semua target (available_pods) dan target pod tertentu.
Apoc
Solusi ini berfungsi dengan baik, tetapi sesuatu yang perlu disebutkan: nilai 'def' Anda harus lebih kecil.
Jerome
9

Jika Anda ingin beberapa target berbagi pod yang sama, gunakan 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

atau hanya

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

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

Adam Smaka
sumber
2

Cara termudah adalah dengan menggunakan target abstrak, di mana setiap pod yang ditentukan akan dihubungkan dengan semua target.

abstract_target 'someNameForAbstractTarget' do
  pod 'podThatIsForAllTargets'
end

target 'realTarget' do
  pod 'podThatIsOnlyForThisTarget'
end
Sayag terguncang
sumber
Bukankah seharusnya realTargetmasuk ke dalam someNameForAbstractTarget daripada di luarnya?
Shubham Bakshi
Menilai dengan jawaban yang lain itu bisa bekerja seperti itu juga.
Shaked Sayag