जावा परियोजनाओं में व्यवस्थित बिल्ड नंबरिंग और संस्करण संख्या प्रबंधन के लिए वर्तमान सर्वोत्तम अभ्यास क्या हैं? विशेष रूप से:
वितरित विकास परिवेश में व्यवस्थित रूप से बिल्ड नंबरों का प्रबंधन कैसे करें
स्रोत संख्या में संस्करण संख्या कैसे बनाए रखें / रनटाइम एप्लिकेशन के लिए उपलब्ध है
स्रोत रिपॉजिटरी के साथ ठीक से एकीकरण कैसे करें
अधिक स्वचालित रूप से संस्करण संख्या बनाम रिपॉजिटरी टैग का प्रबंधन कैसे करें
निरंतर निर्माण बुनियादी ढांचे के साथ कैसे एकीकृत किया जाए
काफी सारे उपकरण उपलब्ध हैं, और चींटी (निर्माण प्रणाली जिसका हम उपयोग कर रहे हैं) में एक कार्य है जो एक बिल्ड संख्या बनाए रखेगा, लेकिन यह स्पष्ट नहीं है कि CVS, svn, या इसी तरह के एकाधिक, समवर्ती डेवलपर्स के साथ इसे कैसे प्रबंधित किया जाए। ।
[संपादित करें]
कई अच्छे और सहायक आंशिक या विशिष्ट उत्तर नीचे दिखाई दिए हैं, इसलिए मैं उनमें से कुछ को संक्षेप में बताऊंगा। यह मुझे लगता है कि इस पर वास्तव में एक मजबूत "सर्वोत्तम अभ्यास" नहीं है, बल्कि अतिव्यापी विचारों का संग्रह है। नीचे, मेरे सारांश और कुछ परिणामी प्रश्न खोजें, जिन्हें लोग अनुवर्ती के रूप में उत्तर देने का प्रयास कर सकते हैं। [स्टैकओवरफ़्लो के लिए नया ... कृपया टिप्पणियां प्रदान करें यदि मैं यह गलत कर रहा हूं।]
यदि आप एसवीएन का उपयोग कर रहे हैं, तो सवारी के लिए एक विशिष्ट चेकआउट का संस्करण आता है। विशिष्ट चेकआउट / संशोधन की पहचान करने वाली एक विशिष्ट बिल्ड संख्या बनाने के लिए बिल्ड नंबरिंग इसका फायदा उठा सकती है। [सीवीएस, जिसे हम विरासत के कारणों के लिए उपयोग कर रहे हैं, यह इस स्तर की अंतर्दृष्टि प्रदान नहीं करता है ... टैग के साथ मैनुअल हस्तक्षेप से इसे अधिक भाग मिलता है।]
यदि आप अपने निर्माण प्रणाली के रूप में मावेन का उपयोग कर रहे हैं, तो एससीएम से एक संस्करण संख्या का उत्पादन करने के लिए समर्थन है, साथ ही साथ स्वचालित रूप से रिलीज के उत्पादन के लिए एक रिलीज मॉड्यूल है। [हम कई कारणों से मावेन का उपयोग नहीं कर सकते, लेकिन यह उन लोगों की मदद करता है जो कर सकते हैं। [ Marcelo-morales के लिए धन्यवाद ]]
यदि आप अपने बिल्ड सिस्टम के रूप में चींटी का उपयोग कर रहे हैं , तो निम्न कार्य विवरण एक जावा .properties फ़ाइल बनाने में मदद कर सकता है, जो निर्माण जानकारी कैप्चर कर सकता है, जिसे बाद में कई तरीकों से आपके बिल्ड में मोड़ा जा सकता है। [हमने हडसन-व्युत्पन्न जानकारी, धन्यवाद मार्टी-लैम्ब को शामिल करने के लिए इस विचार पर विस्तार किया ]।
चींटी और मावेन (और हडसन और क्रूज़ नियंत्रण) बिल्ड नंबर को .properties फ़ाइल में या .txt / .html फ़ाइल में प्राप्त करने के लिए आसान साधन प्रदान करते हैं। क्या यह "सुरक्षित" है इसे जानबूझकर या गलती से छेड़छाड़ करने से रोकने के लिए पर्याप्त है? क्या बिल्ड समय में इसे "वर्जनिंग" श्रेणी में संकलित करना बेहतर है?
अभिकथन: बिल्ड नंबरिंग को हडसन की तरह निरंतर एकीकरण प्रणाली में परिभाषित / अधिनियमित किया जाना चाहिए । [ Marcelo-morales के लिए धन्यवाद ] हमने यह सुझाव लिया है, लेकिन यह रिलीज इंजीनियरिंग के सवाल को तोड़ देता है : रिलीज कैसे होती है? क्या एक रिलीज़ में कई बिल्डऑन हैं? क्या विमोचन से अलग रिलीज के बीच एक सार्थक संबंध है?
प्रश्न: बिल्ड नंबर के पीछे उद्देश्य क्या है? क्या इसका उपयोग QA के लिए किया जाता है? कैसे? क्या यह मुख्य रूप से डेवलपर्स द्वारा विकास के दौरान कई बिल्ड के बीच खंडन करने के लिए उपयोग किया जाता है, या क्यूए के लिए और अधिक यह निर्धारित करने के लिए कि एंड-यूज़र को क्या मिला? यदि लक्ष्य प्रतिलिपि प्रस्तुत करने योग्य है, तो सिद्धांत रूप में यह एक रिलीज संस्करण संख्या प्रदान करना चाहिए - यह क्यों नहीं करता है? (कृपया नीचे दिए गए अपने उत्तरों के एक हिस्से के रूप में इसका उत्तर दें, यह आपके द्वारा किए गए विकल्पों को रोशन करने में मदद करेगा / सुझाएगा ...)
प्रश्न: क्या मैनुअल बिल्ड में नंबर बनाने की जगह है? क्या यह इतना समस्याग्रस्त है कि हर कोई एक सीआई समाधान का उपयोग करना चाहिए?
सवाल: क्या बिल्ड नंबर को SCM में चेक किया जाना चाहिए? यदि लक्ष्य मज़बूती से और स्पष्ट रूप से किसी विशेष बिल्ड की पहचान कर रहा है, तो विभिन्न प्रकार के निरंतर या मैन्युअल बिल्ड सिस्टम से कैसे सामना करें जो क्रैश / पुनरारंभ / आदि हो सकते हैं ...
प्रश्न: क्या एक बिल्ड नंबर छोटा और मीठा होना चाहिए (यानी, मोनोटोनॉली रूप से बढ़ते हुए पूर्णांक) ताकि अभिलेखीय के लिए फ़ाइल नामों में चिपकना आसान हो, संचार में संदर्भित करने के लिए आसान, आदि ... या यह उपयोगकर्ता नाम के लंबे और पूर्ण होना चाहिए, डेटास्टैम्प, मशीन के नाम, आदि?
प्रश्न: कृपया विवरण प्रदान करें कि बिल्ड नंबर का असाइनमेंट आपकी बड़ी स्वचालित रिलीज़ प्रक्रिया में कैसे फिट बैठता है। हाँ, मावेन प्रेमियों, हम जानते हैं कि यह किया जाता है और किया जाता है, लेकिन हम में से सभी ने अभी तक कूल-सहायता नहीं पी है ...
मैं वास्तव में इसे पूरी तरह से उत्तर देना चाहता हूं, कम से कम हमारे cvs / ant / hudson सेटअप के ठोस उदाहरण के लिए, इसलिए कोई व्यक्ति इस प्रश्न के आधार पर पूरी रणनीति बना सकता है। मैं "उत्तर" के रूप में चिह्नित करूँगा जो कोई भी इस विशेष मामले के लिए सूप-टू-नट्स का विवरण दे सकता है (जिसमें cvs टैगिंग योजना, प्रासंगिक CI कॉन्फिग आइटम, और रिलीज़ प्रक्रिया शामिल है जो बिल्ड नंबर को रिलीज़ में तह करता है जैसे कि यह प्रोग्राम है सुलभ।) यदि आप किसी अन्य विशेष कॉन्फ़िगरेशन के लिए पूछना चाहते हैं / जवाब (कहते हैं, svn / maven / क्रूज़ नियंत्रण) मैं यहाँ से प्रश्न के लिए लिंक करूँगा। --JA
[संपादित २३ अक्टूबर ० ९] मैंने शीर्ष मत वाले उत्तर को स्वीकार कर लिया है क्योंकि मुझे लगता है कि यह एक उचित समाधान है, जबकि कई अन्य उत्तर भी अच्छे विचार हैं। अगर कोई शहीद-मेमने के साथ इनमें से कुछ को संश्लेषित करने के लिए एक दरार लेना चाहता है , तो मैं एक अलग को स्वीकार करने पर विचार करूंगा। शहीद मेमने के साथ मेरी एकमात्र चिंता यह है कि यह मज़बूती से क्रमबद्ध बिल्ड नंबर का उत्पादन नहीं करता है - यह बिल्डर के सिस्टम पर एक स्थानीय घड़ी पर निर्भर करता है जो कि असंदिग्ध बिल्ड नंबर प्रदान करता है, जो महान नहीं है।
[संपादित करें 10 जुलाई]
अब हम नीचे की तरह एक वर्ग शामिल करते हैं। यह संस्करण संख्याओं को अंतिम निष्पादन योग्य में संकलित करने की अनुमति देता है। संस्करण जानकारी के विभिन्न रूपों को लॉगिंग डेटा, लंबे समय तक संग्रहीत आउटपुट उत्पादों में उत्सर्जित किया जाता है, और आउटपुट उत्पादों के हमारे (कभी-कभी-बाद के) विश्लेषण का पता लगाने के लिए उपयोग किया जाता है।
public final class AppVersion
{
// SVN should fill this out with the latest tag when it's checked out.
private static final String APP_SVNURL_RAW =
"$HeadURL: svn+ssh://user@host/svnroot/app/trunk/src/AppVersion.java $";
private static final String APP_SVN_REVISION_RAW = "$Revision: 325 $";
private static final Pattern SVNBRANCH_PAT =
Pattern.compile("(branches|trunk|releases)\\/([\\w\\.\\-]+)\\/.*");
private static final String APP_SVNTAIL =
APP_SVNURL_RAW.replaceFirst(".*\\/svnroot\\/app\\/", "");
private static final String APP_BRANCHTAG;
private static final String APP_BRANCHTAG_NAME;
private static final String APP_SVNREVISION =
APP_SVN_REVISION_RAW.replaceAll("\\$Revision:\\s*","").replaceAll("\\s*\\$", "");
static {
Matcher m = SVNBRANCH_PAT.matcher(APP_SVNTAIL);
if (!m.matches()) {
APP_BRANCHTAG = "[Broken SVN Info]";
APP_BRANCHTAG_NAME = "[Broken SVN Info]";
} else {
APP_BRANCHTAG = m.group(1);
if (APP_BRANCHTAG.equals("trunk")) {
// this isn't necessary in this SO example, but it
// is since we don't call it trunk in the real case
APP_BRANCHTAG_NAME = "trunk";
} else {
APP_BRANCHTAG_NAME = m.group(2);
}
}
}
public static String tagOrBranchName()
{ return APP_BRANCHTAG_NAME; }
/** Answers a formatter String descriptor for the app version.
* @return version string */
public static String longStringVersion()
{ return "app "+tagOrBranchName()+" ("+
tagOrBranchName()+", svn revision="+svnRevision()+")"; }
public static String shortStringVersion()
{ return tagOrBranchName(); }
public static String svnVersion()
{ return APP_SVNURL_RAW; }
public static String svnRevision()
{ return APP_SVNREVISION; }
public static String svnBranchId()
{ return APP_BRANCHTAG + "/" + APP_BRANCHTAG_NAME; }
public static final String banner()
{
StringBuilder sb = new StringBuilder();
sb.append("\n----------------------------------------------------------------");
sb.append("\nApplication -- ");
sb.append(longStringVersion());
sb.append("\n----------------------------------------------------------------\n");
return sb.toString();
}
}
टिप्पणी छोड़ दें अगर यह एक विकी चर्चा बनने के योग्य है।
gradle
और / या हो git
?