नुगेट के साथ सर्वश्रेष्ठ अभ्यास: डिबग या रिलीज़?


92

वर्तमान में, मैं पैकेज को आधिकारिक Nuget.org के लिए Nuget के साथ बनाता है पैकेज जारी करता हूं, लेकिन मैं पैकेज को डिबग के लिए Nuget के साथ प्रतीक स्रोत के लिए pushource.org पर भेजता हूं।

EDIT: (जॉन स्कीट, नोदा टाइम डेवलपमेंट से कुछ पूर्वाग्रह के साथ)

NuGet अब दस्तावेज के रूप में NuGet गैलरी और प्रतीकों सोर्स (या समान सर्वर) दोनों को आगे बढ़ाने का समर्थन करता है । दुर्भाग्य से, यहां दो विरोधाभासी आवश्यकताएं हैं:

  • बिना किसी डीबगिंग के केवल लाइब्रेरी का उपयोग करते समय, आप वास्तव में एक रिलीज़ बिल्ड चाहते हैं। कि रिलीज बिल्ड आखिर किस लिए होते हैं।
  • नैदानिक ​​उद्देश्यों के लिए लाइब्रेरी में डिबगिंग करते समय, आप वास्तव में सभी उपयुक्त ऑप्टिमाइज़ेशन अक्षम के साथ डिबग बिल्ड चाहते हैं। यह है कि डिबग बनाता है, सब के बाद के लिए है।

यह ठीक होगा, लेकिन नुगेट (जहां तक ​​मैं बता सकता हूं) दोनों रिलीज और डिबग बिल्ड को एक ही पैकेज में एक उपयोगी तरीके से प्रकाशित करने की अनुमति देता है।

तो, विकल्प हैं:

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

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

मेरा प्रलोभन सिर्फ रिलीज बिल्ड के साथ रखना है, इस उम्मीद के साथ कि अपेक्षाकृत कम लोगों को डिबग करना होगा, और जो लोग रिलीज बिल्ड में अनुकूलन से बहुत अधिक प्रभावित नहीं होंगे । (JIT संकलक वैसे भी अधिकांश अनुकूलन करता है।)

तो, क्या अन्य विकल्प हैं जिन पर हमने विचार नहीं किया है? क्या अन्य विचार हैं जो संतुलन को टिप देते हैं? क्या NuGet संकुल को SymbolSource के लिए पर्याप्त रूप से नया धक्का देना है जो "सर्वश्रेष्ठ अभ्यास" वास्तव में स्थापित नहीं हुआ है?


2
मैं एक ही सवाल पूछने वाला था - हालाँकि वर्तमान में मैं सिनेमाहॉल को रिलीज़ कॉन्फ़िगरेशन पर जोर दे रहा हूँ, यह देखते हुए कि मैं अभी nuget pack ... -Symbolउत्पन्न पैकेज का उपयोग कर रहा हूँ और धकेल रहा हूँ ...
जॉन स्कीट

1
मुझे ऐसा लगता है कि मुझे इस क्यू / ए सत्र को नूगेट के पीछे के लोगों को जमा करना चाहिए और देखना चाहिए कि क्या वे इस पर वज़न कर सकते हैं।
gzak 1:13 बजे

अपने पैकेज में लॉगिंग सेंकना और फिर केवल रिलीज बिल्ड प्रकाशित करें। आप लकड़हारा इंजेक्शन की अनुमति दे सकते हैं जो उपभोक्ता को उसकी पसंद के अनुसार लॉगिंग स्थापित करने के लिए प्रदान करेगा।
सीएसहार्क

जवाबों:


31

SymbolSource के लिए बोलते हुए, मेरा मानना ​​है कि सबसे अच्छा अभ्यास है:

  1. पुश बाइनरी + सामग्री पैकेजों को केवल nuget.org (या किसी अन्य उत्पादन फ़ीड) पर जारी करें
  2. डिबग बाइनरी + सामग्री पैकेज को एक विकास फ़ीड में पुश करें:
    • आधार पर
    • myget.org पर
    • पूर्व-रिलीज़ पैकेज के रूप में nuget.org पर।
  3. दोनों रिलीज़ और डिबग बाइनरी + सिंबल पैकेज को प्रतीकों सोर्स.ओ या किसी अन्य प्रतीक स्टोर पर पुश करें।

जब हम इस पर हैं, यह एक आम गलत धारणा है जो .NET में रिलीज़ और डीबग बनाता है, वास्तव में बहुत भिन्न होता है, लेकिन मैं यह मान रहा हूं कि विभिन्न कोड के कारण यहां भेदभाव होता है जो डीबग की तरह या तो निर्माण में शामिल नहीं हो सकता है या नहीं हो सकता है .Asserts।

उस ने कहा, यह वास्तव में सिंबलसोर्स के लिए दोनों विन्यासों को आगे बढ़ाने के लायक है, क्योंकि आप कभी नहीं जानते कि आपको उत्पादन कोड को डेबिट करने की आवश्यकता कब होगी। उत्पादन में दूर से इसे कठिन बनाने के लिए। ऐसा होने पर आपको अपने टूलिंग से मिलने वाली सहायता की आवश्यकता होगी। जो मैं स्पष्ट रूप से किसी पर इच्छा नहीं करता हूं।

अभी भी संस्करण के संबंध में विचार करने के लिए एक मामला है: क्या 1 संस्करण संख्या साझा करने के लिए 2 अलग-अलग पैकेज (डिबग में और रिलीज़ में) होना सही है? SymbolSource इसे स्वीकार करेगा, क्योंकि यह अलग-अलग बिल्ड मोड शाखाओं में पैकेजों को संग्रहीत करता है और बायनेरीज़ को संग्रहीत करता है, यदि IF केवल NuGet ने तदनुसार पैकेजों को टैग करने की अनुमति दी। यह निर्धारित करने का कोई तरीका नहीं है कि पैकेज डिबग या रिलीज़-मोड है या नहीं।


"प्रकाशन दो नूगेट के लिए बनाता है" हिस्सा मुश्किल सा है। मैंने हमेशा नोडा टाइम की रिलीज़ बिल्ड प्रकाशित की है, इस आधार पर कि मुझे दोनों के बीच चयन करना था। (मुझे सी # परियोजना से करने के बजाय एक nuspec फ़ाइल मिली है।) आप डिबगिंग उत्पादन कोड का उल्लेख करते हैं जैसे कि यह केवल एक रिलीज बिल्ड के साथ और अधिक कठिन है - पिछले "वे बहुत अलग नहीं" भाग के बावजूद। मैं डिबग बिल्ड में NOPs से अवगत हूं, और जाहिर है Debug.Assertआदि - लेकिन क्या आप डीबगिंग के निहितार्थ पर विस्तार कर सकते हैं (आपके जवाब में)? रिलीज़ बिल्ड का उपयोग करना कितना बुरा है?
जॉन स्कीट

मेरे कहने का मतलब सिर्फ इतना था कि आप सभी बायनेरिज़ के लिए उपलब्ध प्रतीकों का उपयोग करना चाहते हैं: यदि दोनों डिबग और रिलीज़ बिल्ड वाइल्ड में हैं, तो आप दोनों के लिए प्रतीक प्रदान करना चाहेंगे। कोड के संदर्भ में उन्हें बहुत अधिक अंतर करने की आवश्यकता नहीं है, लेकिन वे चेकसम में भिन्न होंगे, जो कुछ हैकिंग के बिना प्रतीकों को लोड करना असंभव बनाता है।
ट्रिपलएम्कोड

1
सही। मेरा संभावित समाधान केवल रिलीज़ बायनेरिज़ को रिलीज़ करना है, लेकिन मुझे इस बात की चिंता है कि डिबगिंग के मामले में कितना नुकसान हो सकता है। उदाहरण के लिए, क्या NOP की कमी का मतलब है कि आप ब्रेकप्वाइंट नहीं जोड़ सकते हैं?
जॉन स्कीट

समस्या बिल्ड-टाइम ऑप्टिमाइज़ेशन की तुलना में JIT ऑप्टिमाइज़ेशन के साथ अधिक है। इसलिए यदि आप रिलीज़-मोड पैकेज को धक्का देते हैं और डीबगिंग की आवश्यकता होने पर COMPLUS_ZapDisable = 1 का उपयोग करने की सलाह देते हैं, तो यह मेरे लिए काफी अच्छा होगा। फिर भी NuGet को डिबग और किसी तरह एक साथ रिलीज करने की अनुमति देनी चाहिए।
ट्रिपलएम्कोड

मुझे पता नहीं था कि symbolssource.org मौजूद है। एक खुजली के रूप में मुझे कई बार खरोंच करने की आवश्यकता थी, मैं इसका स्वागत करता हूं।
रेमस रुसानु

4

मैं आपके निष्कर्ष से पूरी तरह सहमत हूं। डिबग के साथ RELEASE और SymbolSource के साथ NuGet पैकेज। यह पैकेजों में सीधे कदम रखने के लिए बहुत दुर्लभ लगता है और कभी-कभी सक्षम किए गए अनुकूलन के साथ डिबग गलत भी स्वीकार्य हो सकता है।

अगर वास्तव में कोई समस्या थी, तो मुझे लगता है कि आदर्श समाधान नूगेट का समर्थन करना होगा। उदाहरण के लिए, कल्पना करें कि क्या डिबगिंग करते समय, यह रिलीज़ DLL को SymbolSource पैकेज में शामिल किए गए के साथ बदल सकता है।

आदर्श रूप में, तब क्या होगा कि nuget pack SomePackage -Symbolsरिलीज़ संस्करण के विरुद्ध एक रिलीज़ नगेट पैकेज बनाया जाएगा, लेकिन एक डीबग प्रतीक पैकेज। और वी.एस. प्लगइन को एसोसिएशन में देखने और डिबग असेंबली में खींचने के लिए पर्याप्त स्मार्ट होने के लिए अपडेट किया जाएगा जब एक डिबगर में चल रहा है और इसके बजाय उन्हें लोड करें। पागलों की तरह, लेकिन दिलचस्प होगा।

हालाँकि, मैं अभी इस बारे में शिकायत करने वाले पर्याप्त लोगों को नहीं देखता कि यह इस समय इसके लायक होगा।

NuGet टीम पुल अनुरोध स्वीकार करती है। :)


मुझे यकीन नहीं है कि मैं आपके दूसरे वाक्य को समझता हूं - मुझे ओपी पर संदेह है (इससे पहले कि मैं संपादित करता हूं) डिबग बिल्ड के लिए सिंबलसोर्स पर मैन्युअल पुश कर रहा था। क्या आप महत्वपूर्ण मुद्दों की परिकल्पना करते हैं, तो रिलीज़ संस्करण की PDB सिंबल स्रोत में डिबग संस्करण के बजाय समाप्त हो जाती है? या यह कि आप क्या वकालत कर रहे थे, और मुझे सिर्फ गलत समझा गया?
जॉन स्कीट

3
"हालांकि, मैं अभी इस बारे में शिकायत करने वाले पर्याप्त लोगों को नहीं देखता कि यह इस समय इसके लायक होगा।" शायद वे शिकायत नहीं कर रहे हैं, लेकिन अगर आपने उपयोगकर्ताओं से एक नमूना पूछा कि वे इसके बारे में क्या सोचते हैं, तो मुझे यकीन है कि आप पाएंगे कि ज्यादातर लोग इस विशेष कदम पर थोड़ा भ्रम की स्थिति स्वीकार करेंगे (NuGet.org और SymbolSource को क्या प्रकाशित करें) .org)। यदि आप पूछते हैं कि उन्होंने क्या चुनना समाप्त किया है, तो आप शायद पाएंगे कि कोई भी सहमत-अभ्यास नहीं है, हर कोई बस अपनी बात करता है।
gzak

7
मैं इस बारे में शिकायत करना चाहता हूं, मैं कहां साइन अप करूं?
एलेक्स

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

1
मुझे पता है, यह एक अच्छा उत्पाद वृद्धि होगी।
htm11h

2

ओपी के पद पर 8 साल हो गए हैं, इसलिए मैं इसे एक दरार दे दूंगा जिसका आजकल उपयोग किया जाता है।

वहाँ एक NuGet पैकेज " में कदम " के 2 तरीके हैं :

1. पीडीबी का वितरण

.symbols.nupkgप्रतीक पैकेजों को विरासत के रूप में माना जाता है और उन्हें उन .snupkgपैकेजों से बदल दिया जाता है जो प्रतीक सर्वर पर प्रकाशित होते हैं । यह सभी प्रमुख विक्रेताओं द्वारा समर्थित है, जैसे कि NuGet.org, Azure DevOps ( कम चिकनी , हालांकि), आदि।

यहाँ आधिकारिक निर्देश हैं । बस इन दो पंक्तियों को csproj फ़ाइल में जोड़ें:

<PropertyGroup>
  <IncludeSymbols>true</IncludeSymbols>
  <SymbolPackageFormat>snupkg</SymbolPackageFormat>
</PropertyGroup>

उपभोक्ता पक्ष पर, सुनिश्चित करें कि आपका IDE NuGet.org (या Azure, आदि) के लिए कॉन्फ़िगर किया गया है, प्रतीक सर्वर को डिबगिंग के समय पैकेज कोड में कदम रखने की अनुमति देता है ।

स्रोत 2. वास्तविक कोड को लिंक करना

कुछ मामलों में, MSB / JIT अनुकूलन के कारण PDB स्रोत कोड की कुछ बारीकियों को छिपा सकते हैं। इसलिए डिबगिंग के दौरान अपने NuGet के वास्तविक स्रोत " स्टेपिंग इनटू " का एक तरीका है । इसे .NET फाउंडेशन से सोर्स लिंक कहा जाता है - " बायनेरिज़ के लिए स्रोत डीबगिंग अनुभव प्रदान करने के लिए एक भाषा- और स्रोत-नियंत्रण अज्ञेय प्रणाली "।

यह विजुअल स्टूडियो 15.3+ और सभी प्रमुख विक्रेताओं (निजी रेपो का भी समर्थन करता है) द्वारा समर्थित है।

यह सेटअप ( आधिकारिक डॉक्स ) के लिए तुच्छ है - बस कुछ झंडे के साथ प्रोजेक्ट फ़ाइल (अपने रेपो के प्रकार पर निर्भर करता है) के लिए एक विकास निर्भरता जोड़ें:

<PropertyGroup>
    <PublishRepositoryUrl>true</PublishRepositoryUrl>
    <EmbedUntrackedSources>true</EmbedUntrackedSources>
</PropertyGroup>
<ItemGroup>
  <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
</ItemGroup>

इस विषय पर और अधिक देखें " 5 चरणों में बेहतर NuGet पैकेज "।


1

Dll और pdb फ़ाइलों के स्रोतों के रूप में डीबग निर्देशिका में फ़ाइलें बनाना और प्रकाशित करना एक प्रतीक पैकेज का उदाहरण है ।

निर्दिष्ट प्रतीक पैकेज सामग्री

एक प्रतीक पैकेज को सम्मेलनों द्वारा बनाया जा सकता है, पिछले अनुभाग में वर्णित तरीके से संरचित एक फ़ोल्डर से, या इसकी सामग्री को फ़ाइल अनुभाग का उपयोग करके निर्दिष्ट किया जा सकता है। यदि आप पहले वर्णित उदाहरण पैकेज का निर्माण करना चाहते हैं, तो आप इसे अपनी nuspec फ़ाइल में डाल सकते हैं:

<files>
  <file src="Full\bin\Debug\*.dll" target="lib\net40" /> 
  <file src="Full\bin\Debug\*.pdb" target="lib\net40" /> 
  <file src="Silverlight\bin\Debug\*.dll" target="lib\sl40" /> 
  <file src="Silverlight\bin\Debug\*.pdb" target="lib\sl40" /> 
  <file src="**\*.cs" target="src" />
</files>

चूंकि प्रतीकों को प्रकाशित करने का उद्देश्य डिबगिंग के दौरान अन्य लोगों को आपके कोड के माध्यम से कदम रखने की अनुमति देना है, इसलिए यह बिना किसी अनुकूलन के डिबगिंग के लिए इच्छित कोड के एक संस्करण को प्रकाशित करने के लिए सबसे विवेकपूर्ण लगता है जो कोड चरण को प्रभावित कर सकता है।


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

यहां हम थोड़ी विषय-वस्तु में उतर जाते हैं। आमतौर पर, "सर्वश्रेष्ठ अभ्यास" के लिए मेरी पसंद वह होगी, जिसे लेखक या तो स्पष्ट रूप से या निहित रूप से सुझाता है, क्योंकि मैं मानता हूं कि उनके पास अधिक अंतर्दृष्टि है (या उदाहरणों के अनुसार, उदाहरणों में समाप्त होने वाली मान्यताओं के मामले में) I. व्यक्तिगत रूप से बोलते हैं। मुझे लगता है कि प्रतीकों को मेरे द्वारा उपयोग किए जा रहे संस्करण से मेल खाना चाहिए। मैं आमतौर पर एक पैकेज का उपयोग नहीं करता था जो मुझे लगता था कि मुझे डिबग करने की संभावना होगी, जब तक कि स्रोत सार्वजनिक नहीं थे और मैं ज़रूरत पड़ने पर खरोंच से संकलन कर सकता था, इसलिए एक पैकेज्ड, डीबग बिल्ड की कमी विशेष रूप से महत्वपूर्ण नहीं है।
tvanfosson

मेरे मामले में अगर किसी को नोदा टाइम डिबग करने की आवश्यकता है क्योंकि उनका मानना ​​है कि नोदा टाइम में एक बग है, तो वे स्रोत को डाउनलोड करना बेहतर होगा (जो वे कर सकते हैं, निश्चित रूप से)। हालाँकि, यह अभी भी उपयोगी है कि यह अभी क्या हो रहा है, यह देखने के लिए Noda Time source कोड में कदम रखने में सक्षम है। मूल रूप से मुझे लगता है कि डिबगिंग के लिए अलग-अलग समाधानों के साथ (कम से कम) दो अलग-अलग परिदृश्य हैं ...
जॉन स्कीट

एक बात जो मुझे पसंद है, वह है .NET के बारे में सोचना: मुझे लगता है कि यह कहना सुरक्षित है कि Microsoft, .NET बिल्ड को रिलीज़ करता है और डीबग बनाता नहीं है। एक रिलीज़ बिल्ड से एक निश्चित स्तर की गुणवत्ता और स्थिरता का पता चलता है, इसलिए विचार यह है कि चीजों का निदान करने के लिए आपको कोड में कदम रखने की आवश्यकता शायद ही कभी होनी चाहिए।
gzak

2
हालाँकि, यह भी एक "बंद-स्रोत" मानसिकता है। मैंने पाया है कि खुले स्रोत की दुनिया में, यह विभिन्न पुस्तकालयों के "स्थिर रिलीज" के कोड में कदम रखने में सक्षम होने की उम्मीद है, क्योंकि चीजें टूटी नहीं हैं, लेकिन क्योंकि कभी-कभी सबसे अच्छा प्रलेखन सिर्फ पुस्तकालय को देखना है। करते हुए।
gzak
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.