ฉันจะระบุเป้าหมายหลายรายการใน podfile ของฉันสำหรับโครงการ Xcode ได้อย่างไร


143

ฉันกำลังใช้ CocoaPods กับโครงการ Xcode 4 ของฉันและฉันมีสามเป้าหมายสำหรับโครงการของฉัน (ค่าเริ่มต้นสำหรับการสร้างรุ่น Lite และอีกรุ่นหนึ่งสำหรับการสร้างเวอร์ชันทดลอง) เป้าหมายทั้งหมดใช้ไลบรารีเดียวกัน แต่ CocoaPods จะเพิ่มเฉพาะไลบรารีแบบคงที่และเส้นทางการค้นหาไปยังเป้าหมายหลักเท่านั้น podfile ของฉันมีลักษณะเช่นนี้:

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'

วิธีเดียวที่ฉันได้รับการทำงานนี้คือการระบุเป้าหมายแต่ละรายการพร้อมกับพ็อดทั้งหมดที่ปรากฏอีกครั้ง

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

มีวิธีที่ดีกว่าในการทำเช่นนี้?


โปรดอ่านเกี่ยวกับเป้าหมายที่เป็นนามธรรม มันคือสิ่งที่คุณต้องการ guide.cocoapods.org/syntax/podfile.html#abstract_target
Nik Kov

คำตอบ:


340

CocoaPods 1.0 ได้เปลี่ยนไวยากรณ์สำหรับสิ่งนี้ ตอนนี้ดูเหมือนว่านี้:

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

ล้าสมัย Pre CocoaPods 1.0 คำตอบ:

ใช่มีวิธีที่ดีกว่า! ตรวจสอบlink_withที่ที่คุณสามารถทำได้link_with 'MyApp', 'MyOtherApp'เพื่อระบุเป้าหมายหลาย ๆ

ฉันใช้สิ่งนี้กับการทดสอบหน่วยเช่นlink_with 'App', 'App-Tests'(ระวังช่องว่างในชื่อของเป้าหมาย)

ตัวอย่าง:

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

คุณสามารถใช้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

เยี่ยมมากคุณจะวาง link_with ไว้ใน podfile ตัวอย่างแรกของฉันที่ไหน คุณสามารถแสดงตัวอย่างให้ฉันดูได้ไหม
ออสติน

อัปเดตคำตอบของฉัน มันไม่สำคัญเลย
Keith Smiley

4
ฉันกำลังลองสิ่งเดียวกัน แต่ในกรณีของฉันฉันกำลังเชื่อมโยงไปยังการอ้างอิงเป้าหมายหลายเป้าหมายของเป้าหมายหลัก นี่เป็นผลให้เกิดข้อผิดพลาดสัญลักษณ์ซ้ำซ้อนในขั้นตอนการเชื่อมโยง คุณรู้วิธีเดินทางโดยใช้ Cocoapods หรือไม่?
Fergal Rooney

2
ดูเหมือนว่าไม่ต้องใช้วงเล็บในรายการเป้าหมายของคุณอีกต่อไป (และใช้งานไม่ได้) deets: guide.cocoapods.org/syntax/podfile.html#link_with
toblerpwn

2
@ KeithSmiley ฉันเห็น ฉันมีปัญหากับช่องว่างเหล่านั้นจริงๆแล้ว ฉันต้องเปลี่ยนชื่อเป้าหมายทั้งหมดของฉันให้ไม่มีที่ว่าง ถือว่า Cocoapods ไม่มี (ทำเพื่อเป้าหมายทั้งหมด) แทน link_with
hishamaus

91

ฉันคิดว่าทางออกที่ดีกว่าคือ

# 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

อ้างอิงจาก: http://natashatherobot.com/cocoapods-installing-same-pod-multiple-targets/


1
คุณคิดว่าทำไมการแก้ปัญหานี้จึงดีกว่า
สุ่มตัวอย่าง

1
@ การสุ่มตัวอย่าง: โปรดผ่านnatashatherobot.com/
Adarsh ​​GJ

9
มันจะดีถ้าคุณเพิ่มคำอธิบายเล็กน้อยที่นี่ (มันเป็นเรื่องดีที่จะให้ข้อมูลทั้งหมดที่จำเป็นในดังนั้นในการเชื่อมโยงกรณีไปลง ฯลฯ ) นอกจากนี้ยังอาจช่วยให้ผู้คนเห็นปัญหาที่มีlink_withและ upvote คำตอบของคุณ :)
Warpling

ฉันชอบวิธีการนี้เพราะจะช่วยให้มีพ็อดมากมายสำหรับเป้าหมายทั้งหมด (available_pods) และกำหนดเป้าหมายพ็อดเฉพาะ
Apoc

โซลูชันนี้ใช้งานได้ดี แต่สิ่งที่ควรค่าแก่การกล่าวถึงคือค่า 'def' ของคุณต้องเป็นตัวพิมพ์เล็ก
เจอโรม

9

หากคุณต้องการให้หลายเป้าหมายแชร์ Pods เดียวกันให้ใช้ 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

หรือเพียงแค่

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

แหล่งที่มา: https://guides.cocoapods.org/using/the-podfile.html


2

วิธีที่ง่ายที่สุดคือการใช้เป้าหมายที่เป็นนามธรรมซึ่งแต่ละพ็อดที่ระบุจะเชื่อมโยงกับเป้าหมายทั้งหมด

abstract_target 'someNameForAbstractTarget' do
  pod 'podThatIsForAllTargets'
end

target 'realTarget' do
  pod 'podThatIsOnlyForThisTarget'
end

ไม่ควรrealTargetเข้าไปข้างใน someNameForAbstractTargetแทนที่จะออกไปข้างนอกเหรอ?
Shubham Bakshi

ตัดสินโดยคำตอบอื่น ๆ ก็สามารถทำงานได้เช่นกัน
เขย่า Sayag
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.