2013-02-10 49 views
5

मैं एक पोर्टेबल क्लास लाइब्रेरी पर काम कर रहा हूं और यह निर्धारित करने के लिए कि क्या इसे पीसीएल या प्लेटफ़ॉर्म-विशिष्ट लाइब्रेरी (यदि यह मौजूद है) का उपयोग करना है या नहीं, यह निर्धारित करने के लिए NuGet द्वारा उपयोग की जाने वाली रणनीति को समझना है।पोर्टेबल और गैर पोर्टेबल कक्षा पुस्तकालय दोनों मौजूद होने पर Nu Nuet संदर्भों को कैसे हल करता है?

मैंने एक नमूना प्रोजेक्ट बनाया जो JSON.NET को संदर्भित करता है जिसमें विभिन्न प्लेटफार्मों के साथ-साथ एक पोर्टेबल क्लास लाइब्रेरी का समर्थन होता है। यहाँ JSON.NET क्या NuGet से उपलब्ध कराता है:

  • net20
  • net35
  • net40
  • SL3-WP
  • SL4
  • SL4-windowsphone71
  • winrt45
  • पोर्टेबल-net40 + एसएल 4 + wp7 + win8

सबसे पहले मैंने नेट 4.0 को लक्षित करने वाली लाइब्रेरी बनाई और NuGet का उपयोग करके JSON.NET का संदर्भ जोड़ा। इसमें नेट 40 लाइब्रेरी का संदर्भ जोड़ा गया। ठीक है, मुझे लगता है कि ऐसा इसलिए है क्योंकि एक सटीक लक्ष्य प्लेटफार्म मैच है। फिर मैंने नेट 4.0.3 को लक्षित किया। अभी भी net40 संस्करण का संदर्भ दिया गया था। तब मैंने सिल्वरलाइट 5 की कोशिश की, जिसमें गैर-पोर्टेबल पुस्तकालयों के बीच सटीक मिलान नहीं था। लेकिन एक एसएल 4 पुस्तकालय चुना गया था। और विंडोज फोन 8 को लक्षित करने के परिणामस्वरूप sl4-windowsphone71 लाइब्रेरी चयन हुआ।

तो ऐसा लगता है कि जब भी लक्ष्य प्लेटफ़ॉर्म के लिए गैर-पोर्टेबल संगत लाइब्रेरी होती है, तो इसे प्राथमिकता दी जाएगी। JSON.NET के मामले में एक पीसीएल केवल तभी चुना जाएगा जब इसे किसी अन्य पोर्टेबल लाइब्रेरी द्वारा संदर्भित किया गया हो। यदि हां, तो मैं हैरान हूँ कि निम्नलिखित स्थिति का समाधान हो जाएगा:

  • net40
  • पोर्टेबल-net40 + SL4 + WP7 + Win8

लाइब्रेरी:

लाइब्रेरी एक दो संस्करण

  • पोर्टेबल-net40 + SL4 + WP7 + Win8
  • : बी संदर्भ एक और एक संस्करण है

अंत में, पुस्तकालय सी संदर्भ दोनों ए और बी और एक संस्करण है:

  • net40

कैसे एक lib ए सी के लिए संकल्प लिया के संदर्भ में हो जाएगा? चूंकि सी सीधे संदर्भ देता है, इसे ए के नेट 40 प्राप्त करना चाहिए, लेकिन सी सी पोर्टेबल बी को संदर्भित करता है, इसके अलावा इसे ए के पोर्टेबल संस्करण भी प्राप्त करना चाहिए, इसलिए लाइब्रेरी के पोर्टेबल और नेट 40 संस्करण दोनों को सी के लिए तैनात किया जाना चाहिए। इसकी निर्भरताओं को हल करने के लिए। क्या मैं सही हूँ?

अद्यतन। मैंने कुछ परीक्षण परियोजनाएं बनाई हैं, और ऐसा लगता है कि लाइब्रेरी सी में एक गैर-पोर्टेबल लाइब्रेरी ए का प्रत्यक्ष संदर्भ होता है, लाइब्रेरी का यह संस्करण ए के पीसीएल संस्करण को जीत और ओवरराइट करेगा, तो ऐसा लगता है कि ऐसा परिदृश्य इसकी अनुमति नहीं है - एक पुस्तकालय सीधे गैर-पोर्टेबल lib का संदर्भ नहीं दे सकता है अगर यह अप्रत्यक्ष रूप से इसके एक अलग (पोर्टेबल) संस्करण का संदर्भ देता है।

उत्तर

4

NuGet "सबसे विशिष्ट" है, या जब संदर्भ के लिए एक पुस्तकालय का कौन सा संस्करण निर्णय लेने से "संकीर्ण" संभव मेल खाते का उपयोग करेगा।

आपकी लाइब्रेरी के पोर्टेबल संस्करण आपकी लाइब्रेरी के प्लेटफ़ॉर्म-विशिष्ट संस्करणों के साथ संगत होना चाहिए। मैं इसे ढांचे के विभिन्न संस्करणों के बीच संगतता के अधिक सामान्य मामले के रूप में सोचता हूं। अपने उदाहरण में, Net40 और net40 के साथ पोर्टेबल को प्रतिस्थापित करें। उस स्थिति में, NuGet को निर्भरता के .NET 4.5 संस्करण का उपयोग करना चाहिए, लेकिन यदि आपके पास .NET 4 संस्करण के विरुद्ध संकलित एक और निर्भरता है, तो इसे चालू करना चाहिए यदि रनटाइम पर इसके बजाय .NET 4.5 संस्करण है।

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

+0

धन्यवाद, डैनियल! अब यह स्पष्ट है। –