मैं अपने Xcode प्रोजेक्ट के लिए अपने पॉडफाइल में कई लक्ष्य कैसे निर्दिष्ट करूं?


142

मैं अपने Xcode 4 प्रोजेक्ट के साथ CocoaPods का उपयोग कर रहा हूं और मेरे प्रोजेक्ट के लिए तीन लक्ष्य हैं (डिफ़ॉल्ट, एक लाइट संस्करण बनाने के लिए और एक डेमो संस्करण बनाने के लिए)। सभी लक्ष्य एक ही पुस्तकालयों का उपयोग करते हैं, लेकिन कोकोपोड्स केवल स्थिर पुस्तकालय और खोज पथ को प्राथमिक लक्ष्य में जोड़ रहा है। मेरा पॉडफाइल इस तरह दिखता है:

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#abbrid_target
Nik Kov

जवाबों:


339

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

अनुमानित प्री कोकोआपॉड्स 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

बहुत अच्छा, तो आप मेरे पहले उदाहरण पॉडफाइल में लिंक_ को कहां डालेंगे? क्या आप मुझे एक उदाहरण दिखा सकते हैं?
ऑस्टिन

मेरे उत्तर को अपडेट किया। यह वास्तव में बात नहीं करनी चाहिए।
कीथ स्माइली

4
मैं एक ही बात की कोशिश कर रहा हूं, लेकिन मेरे मामले में, मैं मुख्य लक्ष्य के कई लक्ष्य निर्भरता से जोड़ रहा हूं। यह लिंकिंग चरण में डुप्लिकेट प्रतीकों की त्रुटि प्राप्त करने के परिणामस्वरूप होता है। क्या आप जानते हैं कि कोकोपोड्स का उपयोग करके इसे कैसे प्राप्त करें?
फर्गल रूनी

2
लगता है कि आपके लक्ष्य की सूची के आसपास के कोष्ठकों की अब आवश्यकता नहीं है (और काम नहीं करता है?)। deets: guide.cocoapods.org/syntax/podfile.html#link_with
Toblerpwn

2
@KeithSmiley मैं देख रहा हूं। मैं वास्तव में उन स्थानों के साथ अभी भी परेशान हो रहा हूं। मुझे कोई रिक्त स्थान नहीं होने के लिए अपने सभी लक्ष्यों का नाम बदलना पड़ा। बेकार है कि Cocoapods के पास link_with के बजाय (सभी लक्ष्यों के लिए) नहीं है।
हिशामौस

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
क्या आप यह समझाते हैं कि यह एक बेहतर उपाय क्यों है?
21

1
@Warpling: कृपया इस के माध्यम से जाने natashatherobot.com/...
आदर्श जी जे

9
यह बहुत अच्छा होगा अगर आप यहाँ उस स्पष्टीकरण का एक सा जोड़ा। (एसओ के मामले में आवश्यक सभी जानकारी रखना अच्छा है, क्योंकि लिंक नीचे जाते हैं, आदि) यह लोगों को समस्या को देखने link_withऔर आपके उत्तर को
उभारने में

मुझे यह दृष्टिकोण पसंद है क्योंकि यह सभी लक्ष्यों (available_pods) के लिए उपलब्ध फली का एक गुच्छा और विशिष्ट फली को लक्षित करने की अनुमति देता है।
Apoc

यह समाधान ठीक काम करता है, लेकिन कुछ ऐसा है जो ध्यान देने योग्य है: आपके 'डिफ' का मान कम होना चाहिए।
जेरोम

9

यदि आप एक ही पॉड्स को साझा करने के लिए कई लक्ष्य चाहते हैं, तो एक अमूर्त_टार्गेट का उपयोग करें

# 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 बजाय अंदर नहीं जाना चाहिए ?
शुभम बक्शी

अन्य उत्तरों को देखते हुए यह उस तरह से भी काम कर सकता है।
शेख सयाग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.