असेंबली संस्करण संख्याओं को बनाए रखने के लिए सर्वोत्तम अभ्यास / मार्गदर्शन


154

मैं एक .NET असेंबली के लिए तीन अलग-अलग असेंबली संस्करण संख्याओं को प्रबंधित करने के तरीके पर संकेत, सुझाव और यहां तक ​​कि श्रुतलेख की तलाश कर रहा हूं। उत्पाद संस्करण सबसे सरल है, क्योंकि ऐसा लगता है कि सामान्य रूप से व्यवसाय द्वारा तय किया जाएगा। फिर, फ़ाइल संस्करण परिनियोजन के बीच संस्करण के लिए प्रतीत होता है, जहाँ वास्तविक असेंबली संस्करण का उपयोग केवल शिपिंग के समय किया जाता है।

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


जवाबों:


211

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

निम्न मानता है कि आप स्रोत नियंत्रण और बिल्ड सर्वर के कुछ रूप का उपयोग करते हैं। संदर्भ के लिए हम TeamCity और Subversion / Git का उपयोग करते हैं । TeamCity परियोजनाओं की एक छोटी (10) संख्या के लिए स्वतंत्र है और एक बहुत अच्छा बिल्ड सर्वर है, लेकिन कुछ अन्य हैं, जिनमें से कुछ पूरी तरह से स्वतंत्र हैं।

क्या एक संस्करण संख्या का मतलब है

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

MajorMinorBuildRevision

  • Revision यह स्रोत नियंत्रण से ली गई संख्या है जो यह पहचानने के लिए कि वास्तव में क्या बनाया गया था।
  • Buildयह एक बढ़ती हुई संख्या है जिसका उपयोग बिल्ड सर्वर पर किसी विशेष निर्माण को खोजने के लिए किया जा सकता है। यह एक महत्वपूर्ण संख्या है क्योंकि बिल्ड सर्वर ने मापदंडों के एक अलग सेट के साथ एक ही स्रोत को दो बार बनाया हो सकता है। स्रोत संख्या के साथ संयोजन में बिल्ड नंबर का उपयोग करने से आपको यह पहचानने की अनुमति मिलती है कि क्या बनाया गया था और कैसे।
  • Minorयह केवल तभी बदलना चाहिए जब सार्वजनिक इंटरफ़ेस में महत्वपूर्ण परिवर्तन हो। उदाहरण के लिए, यदि यह एक एपीआई है, तो क्या उपभोग कोड अभी भी संकलन करने में सक्षम होगा? मेजर नंबर बदलने पर यह संख्या शून्य पर रीसेट होनी चाहिए।
  • Majorइंगित करता है कि आप किस उत्पाद पर हैं। उदाहरण के लिए सभी VisualStudio 2008 विधानसभाओं के मेजर 9 हैं और VisualStudio 2010 10 हैं।

नियम का अपवाद

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

MajorMinorMacroBuild

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

क्या सेट करना है?

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

  • 1.2.0.0 (असेंबलीवेशन)
  • 1.2.3.4 (FileVersion)

यह आपको हॉट फ़िक्स को रोल आउट करने की क्षमता देता है जो मौजूदा कोड को नहीं तोड़ेगा क्योंकि असेंबली के संस्करण मेल नहीं खाते हैं लेकिन आपको इसकी फ़ाइल संस्करण संख्या को देखकर असेंबली का संशोधन / निर्माण देखने की अनुमति देता है। यह एक सामान्य दृष्टिकोण है और विधानसभा के विवरणों को देखने पर कुछ खुले स्रोत विधानसभाओं पर देखा जा सकता है।

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

इसे एक साथ तार कैसे करें

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

  • निकालें AssemblyVersionऔर AssemblyFileVersionसभी प्रोजेक्ट असेंबलीइन्फो .cs फ़ाइलों से विशेषताएँ।
  • एक सामान्य असेंबली जानकारी फ़ाइल बनाएं (इसे VersionInfo.cs पर कॉल करें) और इसे अपने सभी प्रोजेक्टों से लिंक किए गए आइटम के रूप में जोड़ें।
  • "0.0.0.0" के मान के साथ संस्करण में जोड़ें AssemblyVersionऔर AssemblyFileVersionविशेषताएँ।
  • एक MsBuild प्रोजेक्ट बनाएं जो आपकी समाधान फ़ाइल बनाता है।
  • संस्करणइनफो.क्स को अपडेट करने वाले निर्माण से पहले एक कार्य में जोड़ें। वहाँ कई खुले स्रोत MsBuild पुस्तकालयों कि एक असेंबली शामिल हैं कार्य जो संस्करण संख्या सेट कर सकते हैं। बस इसे एक मनमानी संख्या और परीक्षण के लिए सेट करें।
  • बिल्ड नंबर के प्रत्येक सेगमेंट के लिए एक संपत्ति समूह जोड़ें जिसमें एक संपत्ति हो। यह वह जगह है जहाँ आप प्रमुख और मामूली सेट करते हैं। निर्माण और संशोधन संख्या को तर्क के रूप में पारित किया जाना चाहिए।

तोड़फोड़ के साथ:

<PropertyGroup>
    <Version-Major>0</Version-Major>
    <Version-Minor>0</Version-Minor>
    <Version-Build Condition=" '$(build_number)' == '' ">0</Version-Build>
    <Version-Build Condition=" '$(build_number)' != '' ">$(build_number)</Version-Build>
    <Version-Revision Condition=" '$(revision_number)' == '' ">0</Version-Revision>
    <Version-Revision Condition=" '$(revision_number)' != '' ">$(revision_number)</Version-Revision>
</PropertyGroup>

उम्मीद है कि मैं स्पष्ट हूं लेकिन इसमें बहुत कुछ शामिल है। कृपया कोई प्रश्न पूछें। मैं एक और संक्षिप्त ब्लॉग पोस्ट को एक साथ रखने के लिए किसी भी प्रतिक्रिया का उपयोग करूंगा।


क्या आपने GitHub से संस्करण टैग का उपयोग करने पर विचार किया है? मैं बहुत उत्सुक हूं कि यह पहेली में कैसे फिट होगा।
रा.रा.

1
@RRaRa - यह काफी पुरानी पोस्ट है। जबकि इसका अधिकांश हिस्सा मैं अभी भी खड़ा हूं, कुछ चीजें हैं जो मैं अलग करूंगा। NuGet वर्जनिंग बदल गई है कि मैं कैसे काम करता हूं और मैं सफल बिल्ड के लिए Git टैग का उपयोग करता हूं, लेकिन दिन के अंत में असेंबली पर संस्करण संख्या बिल्ड सर्वर पर बिल्ड संस्करण और स्रोत नियंत्रण में टैग संस्करण पर वापस टाई होनी चाहिए।
ब्रंसुम्स्की

57

[असेंबली वर्जन] .NET में एक बहुत बड़ी बात है। Microsoft द्वारा प्रोत्साहित किया जाने वाला एक दर्शन, यह है कि आप इसे ऑटो-इन्क्रिमेंट होने दें, जो असेंबली पर निर्भर सभी प्रोजेक्ट्स को मजबूर कर दे । यदि आप बिल्ड सर्वर का उपयोग करते हैं, तो ठीक काम करता है। कभी भी गलत काम नहीं करना चाहिए लेकिन तलवार लेकर चलने वाले लोगों से सावधान रहें।

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

जब आप असेंबली आपकी पहुंच से बाहर की मशीनों पर असेंबली में लागू किया गया था, तो आप केवल इस वर्जन को बढ़ाकर संस्करण को बढ़ा सकते हैं। यह वह दृष्टिकोण है जो Microsoft उपयोग करता है, उनके .NET असेंबली संस्करण संख्या बहुत कम ही बदलते हैं। अधिकतर अपने ग्राहकों पर होने वाले बहुत दर्द के कारण।

तो Microsoft क्या प्रचार करता है वह नहीं है। इसकी निर्माण प्रक्रिया और संस्करण नियंत्रण हालांकि अद्वितीय है, उनके पास एक समर्पित सॉफ्टवेयर इंजीनियर भी है जो इस प्रक्रिया की निगरानी करता है। बहुत अच्छी तरह से बाहर काम नहीं किया, विशेष रूप से WaitHandle.WaitOne (int) अधिभार दर्द की एक उचित राशि का कारण बना । .NET 4.0 में बहुत अलग दृष्टिकोण के साथ फिक्स्ड है, लेकिन यह दायरे से थोड़ा परे है।

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


11

आप ऑटो-इंक्रीमेंट के लिए संस्करण संख्या के बिल्ड भाग का उपयोग कर सकते हैं।

[assembly: AssemblyVersion("1.0.*")]

आपके वातावरण में एक परीक्षण संस्करण एक ऐसा संस्करण होता है जिसमें एक बिल्ड संस्करण होता है! = 0. रिलीज होने पर आप मामूली भाग में वृद्धि करते हैं और बिल्ड भाग को 0 पर सेट करते हैं, यह है कि आप रिलीज़ असेंबली की पहचान करेंगे।

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


मुझे रिलीज़ संस्करणों के लिए 0 बिल्ड नंबर पसंद है।
ProfK

1
बेशक इसका मतलब है कि आपकी विधानसभा का मजबूत नाम प्रत्येक बिल्ड के साथ बदल जाएगा, चाहे आप इसे चाहते हैं या नहीं।
रिचर्ड

9

को जोड़ना Bronumskis जवाब , मैं करते रहे कि पर सिमेंटिक संस्करण 2.0 मानक के बाद चाहते semver.org , Major.Minor.Build.Revisionनियम यह है कि एक संख्या में वृद्धि के बाद, सही करने के लिए सभी नियमित मान शून्य पर रीसेट कर करना होगा की वजह से अवैध होगा।

मानक का पालन करने का एक बेहतर तरीका उपयोग करना होगा Major.Minor+Build.Revision। यह जानबूझकर उपयोग करने के लिए नहीं है AssemblyVersionAttribute, लेकिन इसके बजाय एक कस्टम विशेषता या स्थिर वर्ग का उपयोग किया जा सकता है।

टीमकिट में सेमेस्टर मेटा-रनर पावर पैक का उपयोग करके उपलब्ध होना चाहिए। Git-flow (विशेष रूप से .NET दुनिया में) के साथ git के लिए, मैंने GitVersion को मददगार पाया ।


2
दिलचस्प है, मैं इसकी जांच करूंगा। आपके द्वारा उल्लेखित संस्करण संख्या प्रारूप का उपयोग असेंबलीइन्फॉर्मेशन वर्सन विशेषता में किया जा सकता है।
ब्रॉन्म्सकी

1

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

... पूर्व के लिए: 1.0.0 *।

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

इसके अलावा, मजबूत कुंजी के साथ विधानसभा पर हस्ताक्षर करने पर विचार करें। यह असेंबली संघर्ष समस्या को हल करेगा यदि आपके पास GAC में पंजीकृत असेंबली के कई संस्करण हैं। MSDN लिंक

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