क्यों बिल्ड.नंबर को सिमेंटिक वर्जनिंग का "दुरुपयोग" कहा जाता है?


35

मैं के बारे में हमारी वरिष्ठ आर्किटेक्ट एक के लिए एक प्रस्तावित निर्माण प्रणाली (Gradle / Artifactory / जेनकींस / बावर्ची) समझा गया था, और वह मेरे लिए एक टिप्पणी की है कि मैं की तरह से असहमत हैं, लेकिन करने के लिए अनुभवी पर्याप्त नहीं कर रहा हूँ वास्तव में वजन में पर।

यह परियोजना जावा लाइब्रेरी (JAR) को अन्य टीमों द्वारा पुन: उपयोग की जाने वाली कलाकृतियों के रूप में निर्मित करती है। संस्करण के लिए, मैं निम्नलिखित शब्दार्थ दृष्टिकोण का उपयोग करना चाहता हूं:

<major>.<minor>.<patch>

जहां patchबग / आपातकालीन सुधारों को minorइंगित करता है, पीछे-संगत रिलीज को majorइंगित करता है , और एपीआई या / या पीछे-असंगत परिवर्तनों के बड़े पैमाने पर रिफ्लेक्टरिंग को इंगित करता है।

जहां तक ​​डिलीवरी यहां तक ​​जाती है कि मैं क्या चाहता हूं: एक डेवलपर कुछ कोड देता है; यह एक QA / TEST वातावरण के निर्माण को ट्रिगर करता है। कुछ परीक्षण चलाए जाते हैं (कुछ स्वचालित, कुछ मैनुअल)। यदि सभी परीक्षण पास हो जाते हैं, तो एक निर्माण बिल्ड जार को हमारे इन-हाउस रेपो में प्रकाशित करता है। इस बिंदु तक JAR को ठीक से संस्करणित किया जाना चाहिए, और मेरी सोच यह थी build.numberकि पैच नंबर के रूप में कार्य करने के लिए हमारे CI टूल द्वारा स्वचालित रूप से उत्पन्न और प्रदान की गई है।

इस प्रकार, संस्करण वास्तव में होगा:

<major>.<minor>.<build.number>

फिर, build.numberसीआई उपकरण द्वारा प्रदान किया गया है।

वास्तुकार ने इसे खारिज करते हुए कहा कि CI बिल्ड नंबर का उपयोग करना अर्थ वर्जनिंग का "दुरुपयोग" था।

मेरा सवाल है: क्या यह सही है, और यदि हां, तो क्यों? और यदि नहीं, तो क्यों नहीं?

जवाबों:


45

आपका बिल्ड नंबर 0 पर रीसेट नहीं किया जाएगा, जब मामूली और प्रमुख संस्करण बढ़ जाते हैं, तो यह स्पेक्स के सेक्शन 7 और 8 का उल्लंघन करता है :

लघु संस्करण Y (xYz | x> 0) जरूरी होगा कि अगर नया, बैकवर्ड संगत कार्यशीलता सार्वजनिक एपीआई के लिए पेश की जाए। अगर किसी भी सार्वजनिक एपीआई कार्यक्षमता को पदावनत के रूप में चिह्नित किया गया है तो उसे बढ़ाना होगा। निजी कोड के भीतर पर्याप्त नई कार्यक्षमता या सुधार पेश किए जाने पर इसे बढ़ाया जा सकता है। इसमें पैच स्तर में बदलाव शामिल हैं। पैच वर्जन 0 तब रीसेट किया जाना चाहिए जब मामूली वर्जन बढ़ा हो।

मुख्य संस्करण X (Xyz | X> 0) सार्वजनिक एपीआई में किसी भी पिछड़े असंगत परिवर्तन शुरू होने पर वृद्धि की जानी चाहिए। इसमें छोटे और पैच स्तर के बदलाव शामिल हैं। पैच और माइनर वर्जन MUST को 0 पर रीसेट किया जाना चाहिए, जब मेजर वर्जन बढ़ा हुआ हो।

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

यदि आप अपना बिल्ड नंबर शामिल करना चाहते हैं, तो आप उन्हें +(धारा 10) के बाद जोड़ सकते हैं :

पैच या पूर्व-रिलीज़ संस्करण के तुरंत बाद एक प्लस साइन और डॉट सेपरेटेड आइडेंटिफ़ायर की एक श्रृंखला को जोड़कर मेटाडेटा MAY का निर्माण किया जाना चाहिए। पहचानकर्ता में केवल ASCII अल्फ़ान्यूमेरिक्स और हाइफ़न शामिल हैं [0-9A-Za-z-]। पहचानकर्ता खाली नहीं होना चाहिए। संस्करण मिसाल का निर्धारण करते समय मेटाडेटा SHOULD को अनदेखा करें। इस प्रकार दो संस्करण जो केवल निर्माण मेटाडाटा में भिन्न होते हैं, उनकी एक ही पूर्वता है। उदाहरण: 1.0.0-Alpha + 001, 1.0.0 + 20130313144700, 1.0.0-beta + exp.sha.5114f85।


क्विक फॉलोअप @Residuum (और उत्तर के लिए BTW +1): संस्करण संख्याओं को हमेशा मैन्युअल रूप से प्राप्त किया जाना चाहिए ? यदि नहीं, तो सीआई / बिल्ड नंबर के बदले में कौन से उपकरण इस्तेमाल किए जा सकते हैं?
herpylderp

1
@herpylderp बिल्कुल नहीं, टॉम प्रेस्टन-वर्नर की 'कल्पना' सिर्फ उनकी राय है, अन्य कंपनियों के भार अलग-अलग होते हैं (आमतौर पर एक-दूसरे के मानकों के समान)। उनमें से अधिकांश में, स्वचालित रूप से उत्पन्न संख्या संस्करण का हिस्सा है। CI बिल्ड नंबर का उपयोग करना एक समझदारी की बात है।
gbjbaanb

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

2
मेरे लिए, मैं सिर्फ [प्रमुख] [नाबालिग] का उपयोग करता हूं। [संशोधन]। [एसएलएन-संस्करण] डीएलएल के लिए, और [प्रमुख] [मामूली] [स्थापित करने के लिए [एसवीएन-संस्करण]। CI बिल्ड नंबर केवल आंतरिक उपयोग के लिए है, यह दिखाने के लिए कि एक निर्माण जो विफल रहा है, वह सीआई पर्यावरण में बदलाव (कुंजी प्रमाणपत्र स्थापित करके, जीएसी आदि में सामान्य पुस्तकालयों को जोड़ते हुए) के समान सटीक कोडबेश के खिलाफ फिर से चलाया जा सकता है।
कीथ्स

1
@gbjbaanb et al।: "सिमेंटिक वर्जनिंग" के बारे में हर चर्चा में, जिसका मैं हिस्सा था, semver.org से परिभाषा विषय था। "सिमेंटिक वर्जनिंग" के लिए वेब पर खोजें, और कम से कम पहला पेज semver.org से परिभाषा के बारे में पेशेवरों / विपक्ष के साथ आता है । आप अपनी स्वयं की संस्करण योजनाओं का उपयोग करने के लिए स्वतंत्र हैं, लेकिन इसे शब्दार्थ संस्करण नहीं कहते हैं, क्योंकि यह शब्द स्पष्ट रूप से परिभाषित है।
रेसिडम

2

एक कारण यह है कि पैच को कई बिल्ड की आवश्यकता हो सकती है, इसलिए यदि आपके पास संस्करण 5.7 है, और आप इसे 5.7.1 पर पैच करना चाहते हैं, लेकिन आपके पहले 2 बगफिक्स जब वे सीआई सिस्टम में सबमिट किए जाते हैं, तब निर्माण करने में विफल रहते हैं, तो आप होंगे 5.7.3 पर इससे पहले कि आप अपना पहला पैच जारी करें!

इसका उत्तर केवल 4 अंकों का उपयोग करना है (जैसा कि Microsoft सिस्टम में है)। 4th एक बिल्ड नंबर है और इसका उपयोग "केवल जानकारी के लिए" किया जाता है। आम तौर पर लोग रिपॉजिटरी संस्करण संख्या को वहां डालते हैं (यदि वे एसवीएन या टीएफएस या इसी तरह का उपयोग करते हैं) जो वास्तव में अच्छा है क्योंकि आप यह सत्यापित कर सकते हैं कि बायनेरिज़ बनाने के लिए कौन सा सटीक उपयोग किया गया था। यदि आपके पास ऐसा कुछ नहीं है, तो CI बिल्ड नंबर एक उचित अनुमान है (जैसा कि आप उम्मीद करेंगे कि आपका CI सिस्टम बिल्ड नंबरों को याद कर सकता है और इसे रेपो इतिहास से जोड़ सकता है, लेकिन आप CI पर निर्भर नहीं हैं सिस्टम उन्हें याद कर रहा है - आप पुराने बिल्ड को कभी नहीं हटा सकते हैं)।

एक बात ध्यान दें, संस्करण के लिए Microsoft स्कीमा बिल्ड संख्याओं के लिए 3 स्थिति का उपयोग करता है। क्रोम सिर्फ 1 नंबर का उपयोग करता है। उबंटू तारीख का उपयोग करता है। उपयोग करने के लिए कोई "मानक" नहीं है , सिवाय इसके कि सभी संख्याओं में वृद्धि होनी चाहिए।


5
हालाँकि इसका कोई मानक नहीं है जो सार्वभौमिक रूप से उपयोग किया जाता है या लागू किया जाता है, लेकिन प्रश्न विशेष रूप से सिमेंटिक संस्करण के बारे में प्रतीत होता है जिसमें एक विनिर्देश है।
डोभाल

यहां तक ​​कि वह क्षेत्र में टूट गया है, उदाहरण के लिए Microsoft का NuGet संस्करण एक अर्धचालक का उपयोग करता है, टूटे हुए तरीके से (बिल्ड संख्याओं के लिए प्रीलेयरेज शैली का उपयोग करके), और रूबी प्रमुख का उपयोग करता है ।min.teeny.patch । वैसे भी, जैसा कि बिल्ड नंबर सेमर का हिस्सा हो सकता है, आर्किटेक्ट टश बात कर रहा था (हालांकि माना जाता है, यह + बिल्ड होना चाहिए, 3 जी स्थिति में नहीं)।
gbjbaanb

2
सेमी वीर 2.0 का अनुमान 2013 से है और 1.0 का अनुमान 2012 से है जहां तक ​​मैं बता सकता हूं। यह संभावना है कि नुगेट और रूबी कल्पना प्रकट होने से पहले अपनी बात कर रहे थे। ऐसा नहीं है कि सेम वीर कल्पना उपन्यास है; यह सिर्फ औपचारिकता करता है कि लोग पहले से क्या कर रहे हैं इसलिए हम आखिरकार एक दर्जन विविधताओं के बजाय इसे करने के एक तरीके पर सहमत हो सकते हैं।
डोभाल

"आपके पास संस्करण 5.7 है, और आप इसे 5.7.1 पर पैच करना चाहते हैं, लेकिन आपके पहले 2 बगफिक्स जब वे सीआई सिस्टम में सबमिट किए जाते हैं, तब निर्माण करने में विफल रहते हैं, फिर आप अपना पहला पैच जारी करने से पहले 5.7.3 पर होंगे। ! " ठीक है, लेकिन ऐसा क्या? मुझे यह कहते हुए कुछ भी याद नहीं है कि संख्या को छोड़ना नहीं चाहिए।
एंडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.