Làm cách nào để chỉ định nhiều mục tiêu trong podfile cho dự án Xcode của tôi?


142

Tôi đang sử dụng CocoaPods với dự án Xcode 4 của mình và tôi có ba mục tiêu cho dự án của mình (mặc định, một để xây dựng phiên bản rút gọn và một để xây dựng phiên bản demo). Tất cả các mục tiêu sử dụng cùng một thư viện, nhưng CocoaPods chỉ thêm thư viện tĩnh và đường dẫn tìm kiếm vào mục tiêu chính. Podfile của tôi trông như thế này:

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'

Cách duy nhất để tôi làm việc này là chỉ định từng mục tiêu riêng lẻ với tất cả các nhóm được liệt kê lại.

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ó cách nào tốt hơn để làm điều này?


Xin vui lòng, đọc về mục tiêu trừu tượng. Đó là những gì bạn cần. guide.cocoapods.org/syntax/podfile.html#ab bát_target
Nik Kov

Câu trả lời:


339

CocoaPods 1.0 đã thay đổi cú pháp cho việc này. Bây giờ nó trông như thế này:

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

Lỗi thời Pre CocoaPods 1,0 câu trả lời:

Vâng, có một cách tốt hơn! Kiểm tra link_withnơi bạn có thể làm link_with 'MyApp', 'MyOtherApp'để chỉ định nhiều mục tiêu.

Tôi sử dụng điều này với các bài kiểm tra đơn vị như link_with 'App', 'App-Tests'(coi chừng khoảng trắng trong tên của mục tiêu).

Thí dụ:

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'

Cập nhật 2017

Bạn có thể sử dụng trừu tượng

# 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

Tuyệt vời, vậy bạn sẽ đặt link_with trong ví dụ đầu tiên của tôi ở đâu? Bạn có thể chỉ cho tôi một ví dụ?
Austin

Cập nhật câu trả lời của tôi. Nó không thực sự quan trọng.
Keith Smiley

4
Tôi đang thử điều tương tự, nhưng trong trường hợp của tôi, tôi đang liên kết với nhiều phụ thuộc mục tiêu của mục tiêu chính. Điều này dẫn đến việc nhận được các ký hiệu trùng lặp trong giai đoạn liên kết. Bạn có biết làm thế nào để khắc phục điều này bằng cách sử dụng Cocoapods?
Fergal Rooney

2
Có vẻ như các dấu ngoặc quanh danh sách Mục tiêu của bạn không còn cần thiết nữa (và không hoạt động?). Deets: guides.cocoapods.org/syntax/podfile.html#link_with
toblerpwn

2
@KeithSmiley tôi thấy. Tôi thực sự đã gặp rắc rối với những không gian đó. Tôi đã phải đổi tên tất cả các mục tiêu của mình để không còn chỗ trống. Sucks mà Cocoapods không có (làm cho tất cả các mục tiêu) thay vì link_with.
hishamaus

91

Tôi nghĩ giải pháp tốt hơn là

# 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

Tham khảo từ: http://natashatherobot.com/cocoapods-installing-same-pod-multipl-target/


1
Bạn có phiền giải thích tại sao đây là một giải pháp tốt hơn?
Warpping 7/8/2015

1
@Warpling: Vui lòng xem qua natashatherobot.com/
Adarsh ​​GJ

9
Sẽ thật tuyệt nếu bạn thêm một chút lời giải thích đó vào đây. (Đó là tốt đẹp để giữ tất cả các thông tin cần thiết về SO trong trường hợp liên kết đi xuống, vv) Nó cũng có thể giúp mọi người nhìn thấy vấn đề với link_withvà upvote câu trả lời của bạn :)
Warpling

Tôi thích cách tiếp cận này vì nó cho phép một loạt các nhóm có sẵn cho tất cả các mục tiêu (Available_pods) và các nhóm cụ thể nhắm mục tiêu.
Apoc

Giải pháp này hoạt động tốt, nhưng một điều đáng nói: giá trị 'def' của bạn phải là chữ thường.
Jerome

9

Nếu bạn muốn nhiều mục tiêu chia sẻ cùng một nhóm, hãy sử dụng một trừu tượng.

# 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

hoặc chỉ

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

nguồn: https://guides.cocoapods.org/USE/the-podfile.html


2

Cách dễ nhất là sử dụng một mục tiêu trừu tượng, trong đó mỗi nhóm được chỉ định sẽ được liên kết với tất cả các mục tiêu.

abstract_target 'someNameForAbstractTarget' do
  pod 'podThatIsForAllTargets'
end

target 'realTarget' do
  pod 'podThatIsOnlyForThisTarget'
end

Không nên realTargetđi vào bên trong someNameForAbstractTarget chứ không phải bên ngoài nó?
Shubham Bakshi

Đánh giá bằng các câu trả lời khác, nó cũng có thể hoạt động theo cách đó.
Lắc Sayag
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.