2017-11-18 11 views
6

मैं a .NET Standard project और NuGet के साथ मिल रहा है। मेरे पास एक कामकाजी परियोजना है और uploaded it to NuGet.org है। मेरा प्रोजेक्ट लक्ष्य .NET मानक 1.3, जो should support .NET Framework 4.6 और .NET कोर 1.0।मेरा .NET मानक NuGet पैकेज इतनी निर्भरता क्यों ट्रिगर करता है?

लेकिन जब मैंने अपनी परियोजना (NuGet के माध्यम से) को एक नई .NET Framework 4.6 प्रोजेक्ट में जोड़ने की कोशिश की, तो निर्भरता पैकेजों तक हल हो गई! वे सभी सिस्टम लाइब्रेरीज़ हैं और Microsoft.NETCore.Platforms या NETStandard.Library 1.6.1 की निर्भरता प्रतीत होते हैं। (Gist of full PM output.)

मेरी परियोजना केवल आयात (using) कुछ हद तक पुस्तकालयों, जिनमें से कोई भी मैन्युअल रूप से जोड़ा गया नहीं है; यानी वे सभी पुस्तकालय हैं जो ".NET मानक" के साथ आए थे। इन पुस्तकालयों हैं:

  1. सिस्टम
  2. सिस्टम.पाठ
  3. System.Reflection
  4. System.Linq
  5. System.Collections.Generic;

बात यह है कि मैंने अपना प्रोजेक्ट लक्ष्य .NET मानक बनाने का फैसला किया क्योंकि मैं चाहता था कि यह .NET Framework और .NET कोर अनुप्रयोगों पर सहजता से काम करे। मैंने सोचा कि मानक का पूरा बिंदु न्यूनतम स्तर की संगतता निर्धारित करना था। विस्तार से, मुझे लगता है कि मैंने माना था (शायद गलती से) कि System.Console जैसे पुस्तकालय कोर या फ्रेमवर्क में स्वचालित रूप से उपलब्ध होंगे।

मैंने इस तरह की कुछ भी नहीं देखी जब मैंने अपने मानक प्रोजेक्ट का परीक्षण उसी समाधान के भीतर फ्रेमवर्क और कोर प्रोजेक्ट में निर्भरता के रूप में किया, इसलिए मुझे संदेह है कि यह एक NuGet बात हो सकती है।

वास्तव में यहां क्या चल रहा है? और मैं निर्भरता की एक बड़ी सूची के बिना NuGet पर उपलब्ध .NET मानक लाइब्रेरी कैसे बना सकता हूं?

क्या यह मेरे NuGet पैकेज को निर्दिष्ट करने के तरीके में एक समस्या है? या मैंने मूल रूप से कुछ गलत समझा है?

+0

क्या आपने देखा है कि वास्तव में आउटपुट फ़ोल्डर में कुछ भी जोड़ा गया है, या पैकेज स्थापित करते समय यह केवल निर्भरताओं की एक डरावनी सूची है या नहीं? मेरा अनुभव यह है कि यह उत्तरार्द्ध है, जो अभी भी महान नहीं है, लेकिन चिंताजनक नहीं है। –

+0

@ जोनस्केट मेरे पैकेज फ़ोल्डर में अब फ़ोल्डरों की एक लंबी सूची है, जब मैं वास्तव में केवल एक की उम्मीद कर रहा था। अतिरिक्त रूप से, "NuGet संकुल प्रबंधित करें" स्क्रीन सभी संकुल दिखाती है (जिनमें से कुछ में लंबित अपडेट हैं)। –

+2

सही - लेकिन बिन निर्देशिका में क्या है? (एफडब्ल्यूआईडब्ल्यू, मैं पूरी तरह से सहमत हूं कि यह एक बहुत ही दुर्भाग्यपूर्ण स्थिति है।मुझे नहीं पता कि बाद में रिलीज के लिए इसे बेहतर किया गया है या नहीं। लेकिन यही कारण है कि मैं कुछ पैकेजों के उत्पादन के लिए, मैं नेट 45 लक्ष्य के साथ-साथ netstandard1.x संस्करण भी बना सकता हूं ...) –

उत्तर

9

आपने कुछ भी गलत नहीं किया है, ऐसा होने की उम्मीद है। यदि आप अपने स्वयं के डीएलएल को किसी नए .NET Framework प्रोजेक्ट में जोड़े जाने से ज्यादा कुछ नहीं चाहते हैं, तो आपको अपनी लाइब्रेरी के लिए .NET Framework संस्करण के लिए .NET मानक 2.0 को लक्षित करना होगा जो एपीआई और असेंबली संस्करणों का मूल रूप से समर्थन करता है - जो जा रहा है 4.7.2 होने के लिए (जबकि .NET Framework 4.7.1 सभी एपीआई का समर्थन करता है, वहां कुछ असेंबली के संस्करण के साथ बग थे और इसलिए टूलिंग (वीएस 2017 15.5+) इसे ठीक करने के लिए अतिरिक्त असेंबली जोड़ देगा)।

जो आप देख रहे हैं वह साइड इफेक्ट्स हैं कि .NET मानक कैसे बनाया गया है और समर्थित ढांचे के लिए समर्थन लागू किया गया है। यह आपके द्वारा लक्षित .NET मानक संस्करण और लाइब्रेरी पैकेज को संदर्भित करने के लिए उपयोग की जाने वाली टूलिंग के आधार पर भी अलग है।

.NET मानक < 2.0 में, आप NETStandard.Library मेटा-पैकेज का संदर्भ देते हैं जो बदले में अतिरिक्त संदर्भ (System.*) संकुल संदर्भित करता है। उन संकुलों में संदर्भ असेंबली होती है जो ".NET मानक अनुबंध" बनाती हैं - एपीआई का एक सेट और असेंबली नाम + संस्करण।

जब आप .NET मानक 1.0-1.6 के लिए बनाए गए NuGet पैकेज को किसी अनुप्रयोग द्वारा संदर्भित किया जाता है, तो ये व्यक्तिगत पैकेज संदर्भ असेंबली नहीं लाते हैं बल्कि आवेदन लक्ष्य को ढांचे के लिए कार्यान्वयन असेंबली नहीं लाते हैं।

.NET कोर के लिए, ये उन असेंबली से मेल खाते हैं जो पहले से ही रनटाइम का हिस्सा हैं, इसलिए डीएलएल फाइलें निर्मित एप्लिकेशन के बगल में समाप्त नहीं होंगी। हालांकि यह बदल गया जब .NET कोर 1.1 (NETStandard.Library संस्करण 1.6.1) के लिए संकुल का एक नया सेट जारी किया गया था। इसके परिणामस्वरूप .NET कोर 1.0 के लिए बनाए गए अनुप्रयोगों को नए कार्यान्वयन असेंबली प्राप्त करने का अंत हो गया जो कि .NET कोर 1.1 में शामिल होने के लिए थे। (सौभाग्य से, 1.1 को तब "दीर्घकालिक समर्थन" संस्करण बनाया गया था, जिसके बाद इस सम्मेलन के बारे में चर्चा हुई थी एलटीएस वादे का हिस्सा हैं)।

इन पुस्तकालयों में .NET Framework पर (System.Net.Http जैसे कुछ अपवादों के साथ) बहुत कुछ नहीं करते - वे बस सिस्टम असेंबली के लिए आगे बढ़ते हैं। तो उदाहरण के लिए "अनुबंध" परिभाषित करता है कि System.Object को System.Runtime.dll असेंबली में परिभाषित किया गया है। तो System.Runtime.dll फ़ाइल जिसे आप .NET Framework अनुप्रयोग में समाप्त करते हैं, में System.Runtime.dll शामिल है जिसमें .NET Framework के mscorlib.dll पर आगे का प्रकार शामिल है। .NET कोर में पहले से ही एक अलग System.Runtime.dll है जो उस प्लेटफॉर्म के लिए कुछ अलग करता है। यह तंत्र दोनों प्लेटफॉर्म पर काम करने के लिए एक एकल डीएलएल फ़ाइल के लिए अनुमति देता है क्योंकि उन प्रकार के आगे और अतिरिक्त कार्यान्वयन दोनों कार्यान्वयन पर काम कर रहे "अनुबंध" (प्रकार + असेंबली + असेंबली संस्करण) को आश्वस्त करते हैं।

.NET मानक 2.0 का उद्देश्य संकुल और डीएलएल की आवश्यकता को कम करने और NETStandard.Library को अपडेट करने के लिए आवश्यक होने पर भी एक नया .NET कोर संस्करण जारी किया गया है।

तो .NET मानक 2.0 और .NET कोर 2.0 के लिए, NETStandard.Library पैकेज केवल एक परियोजना को कोड संकलित करने के लिए संदर्भ असेंबली लाता है, लेकिन परिणामी NuGet पैकेज अब इस पैकेज पर निर्भर नहीं करता है। तो जब आप .NET मानक 2.0 को लक्षित करते हुए लाइब्रेरी बनाते हैं और इसे प्रकाशित करते हैं, तो इसमें कोई NuGet निर्भरता नहीं होगी (जब तक आप अतिरिक्त जोड़ नहीं देते)।

.NET मानक लाइब्रेरी का उपभोग करने के दौरान "समर्थन पुस्तकालयों" को लाने के लिए तर्क के निर्माण के दौरान उपयोग की जाने वाली टूलिंग में स्थानांतरित किया गया था। इसलिए जब एक लाइब्रेरी जिसमें netstandard.dll का संदर्भ शामिल है, तो .NET Framework प्रोजेक्ट में जोड़ा जाता है, तो टूलिंग तब उपयोग किए जा रहे .NET Framework के संस्करण के आधार पर आवश्यक समर्थन DLL जोड़ देगा। यह .NET मानक 2.0 के साथ-साथ .NET मानक 1.5+ के लिए किया गया था क्योंकि .NET Framework 4.6.1 को इस प्रकार की DLL फ़ाइलों के माध्यम से .NET मानक 2.0 (पहले 1.4 था) के साथ संगत रूप से संगत किया गया था। वही टूलींग यह भी सुनिश्चित करती है कि अगर किसी भी एप्लिकेशन प्रोजेक्ट में NuGet पैकेज लाए जाते हैं, तो भी NuGet के माध्यम से लाए गए किसी भी .NET मानक कार्यान्वयन पुस्तकालय को बिल्ड से हटा दिया जाता है। इसलिए यदि आप एक .NET मानक 1.0 NuGet पैकेज का संदर्भ देते हैं जो .NET कोर 1.0 जारी किए जाने पर बनाया गया था, तो इसकी सभी NuGet निर्भरताओं को छंटनी की जाती है और आपको इसके बजाय निर्माण टूलिंग के साथ समर्थित लाइब्रेरी मिलती है।

विचार था कि .नेट फ्रेमवर्क 4.7.1 सभी आवश्यक विधानसभाओं "इनबॉक्स" होते हैं तो एक netstandard.dll, System.Runtime.dll आदि .नेट फ्रेमवर्क का हिस्सा है और किसी भी नेट स्टैंडर्ड 1.0-2.0 DLL फ़ाइल हैं कि होगा "बस काम ", समस्या यह थी कि इन" इनबॉक्स "डीएलएल फाइलों में कुछ असेंबली के लिए बहुत कम संस्करण संख्या थी, इसलिए पुस्तकालय लोड होने में असफल हो जाएंगे - यह टूलिंग को फिर से बदलकर तय किया गया था ताकि डीएलएल फाइलों को उच्च संस्करण संख्याओं के साथ समर्थन पुस्तकालयों के रूप में शामिल किया जा सके। "इनबॉक्स" .NET फ्रेमवर्क असेंबली पर आगे बढ़ें। यह .NET Framework 4.7.2 में तय करने की योजना है।

+0

धन्यवाद मार्टिन। इस बहुत व्यापक उत्तर को पूरी तरह से पचाने के लिए मुझे थोड़ी देर लग गई। मुझे लगता है कि .NET मानक अभी भी अपने बचपन में है और यह तंग दर्द में से एक है। मैं तंग बैठूंगा और फ्रेमवर्क के संस्करण 4.7.2 के लिए प्रतीक्षा करूंगा। –

+0

मेरा ध्यान एक वर्कअराउंड पर खींचा गया है: http://blog.tdwright.co.uk/2017/11/21/update-getting-net-standard-apps-playing-nicely-on-nuget/ –

+1

हां, NuGet's गेट-नजदीक-फ्रेमवर्क तर्क अन्य लोगों पर विचार करने से पहले निम्न संस्करणों के साथ एक ही लक्ष्य ढांचे को पसंद करता है (इसलिए 'net471' प्रोजेक्ट' netstandard2.0' 'पर' net35' भी चुनता है) –

संबंधित मुद्दे