दो अलग सॉफ्टवेयर संस्करण बनाए रखना संस्करण नियंत्रण में समान कोडबेस से


45

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

मैं वर्तमान में उपयोग कर पर विचार कर रहा हूँ masterऔर developमुख्य codebase (निःशुल्क संस्करण) की ओर के साथ के लिए शाखाओं master-premiumऔर develop-premiumशाखाओं का भुगतान किया संस्करण के लिए। जब एक परिवर्तन मुक्त संस्करण में किया जाता है और masterशाखा में विलय हो जाता है ( developपाठ्यक्रम पर पूरी तरह से परीक्षण के बाद ), तो इसे अधिक परीक्षण के लिए कमांड के develop-premiumमाध्यम से शाखा में कॉपी किया जाता है cherry-pickऔर फिर विलय हो जाता है master-premium

क्या इस स्थिति को संभालने के लिए यह सबसे अच्छा वर्कफ़्लो है? क्या किसी संभावित समस्या, चेतावनी, या नुकसान के बारे में पता होना चाहिए? क्या मेरे पास पहले से जो कुछ है, उससे बेहतर ब्रांचिंग रणनीति है?

आपके सुझावों का स्वागत है!

PS यह Git में संग्रहीत PHP स्क्रिप्ट के लिए है, लेकिन उत्तर किसी भी भाषा या VCS पर लागू होने चाहिए।

जवाबों:


83

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

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

इस डिज़ाइन के होने से आप 5 अलग-अलग स्वादों को भी जहाज कर सकते हैं और बहुत लचीले हो सकते हैं, शायद तीसरे पक्ष को भी योगदान करने की अनुमति दें।


2
हाँ यह वही है जो मैं बिस्तर पर जाने से पहले कल रात के बारे में सोचने लगा था। धन्यवाद!
जोसेफ लीड

3
आधुनिक विंडोज को इस तरह से डिज़ाइन किया गया है, सभी संस्करणों में सभी समान कोड हैं, और उपयोग में लाइसेंस कुंजी के आधार पर अनलॉक की गई विशेषताएं हैं।
मिंग डक

39

मैं इस उद्देश्य के लिए शाखाओं का उपयोग नहीं करने की दृढ़ता से सलाह देता हूं । सामान्य तौर पर, आपको उन चीजों के लिए शाखाओं पर विचार करना चाहिए जो (या हो सकती हैं) बाद में एक साथ फिर से विलय हो सकती हैं (या रिलीज शाखाओं के लिए, जहां आप अंततः शाखाओं में से एक का विकास रोकते हैं)। आपके मामले में, आप कभी भी अपने "मूल" और "प्रीमियम" संस्करणों को एक साथ विलय नहीं करेंगे, और वे दोनों अनिश्चित काल तक बनाए रहेंगे, इसलिए शाखाएं उपयुक्त नहीं हैं।

इसके बजाय, स्रोत कोड के एक सामान्य संस्करण को बनाए रखें और सशर्त संकलन का उपयोग करें (उदाहरण के लिए #ifdefC / C ++ में, सुनिश्चित नहीं है कि PHP के लिए समकक्ष क्या है) "मूल" और "प्रीमियम" के बीच भिन्न होने वाले कोड के वर्गों को शामिल करना या बाहर करना।

ऐसा लगता है कि PHP में ऐसी सशर्त संकलन सुविधा नहीं हो सकती है, जिससे आप cppअपने सामान्य स्रोत कोड को प्रीप्रोसेस करने के लिए C प्रीप्रोसेसर ( ,, आपके पास शायद यह पहले से ही है) का उपयोग कर सकते हैं और उससे "मूल" और "प्रीमियम" का उत्पादन कर सकते हैं। पूर्वप्रक्रमक निर्देशों के बिना संस्करण। बेशक, यदि आप ऐसा करने के लिए चुनते हैं तो आपको makeप्रीप्रोसेसर चलाने की प्रक्रिया को स्वचालित करने के लिए उपयोग करना चाहिए या कुछ इसी तरह का होना चाहिए ।


आप शाखाओं के बारे में जो कह रहे हैं वह कुल समझ में आता है! शायद इसके बजाय मैं एक अलग रेपो बना सकता हूं जिसमें सिर्फ प्रीमियम कोड हो और इसे आधार कोड के साथ संयोजित करने के लिए किसी प्रकार की रिलीज़ स्क्रिप्ट या उप-मॉड्यूल का उपयोग किया जाए? हालांकि इससे टीडीडी और कठिन हो सकता है ...
जोसेफ लीड

14
एक और रिपॉजिटरी बनाना शाखाओं को बनाने से भी बदतर है! आप निश्चित रूप से एक समाधान चुनना चाहते हैं जिसमें संस्करण कोड का कम से कम दोहराव शामिल है।
ग्रेग हेविल जिल

2
दूसरे रेपो का बिंदु केवल अतिरिक्त कोड को घर देना है - पूरे ऐप की एक और कॉपी नहीं।
जोसेफ लीड

1
आह, मैं देखता हूं कि यह "प्लगइन" मॉडल की तरह होगा, जहां आपके मूल कोड में प्लगइन्स को लोड करने और चलाने की क्षमता है (यदि वे मौजूद हैं)। प्लगइन कोड अलग है और प्रीमियम सुविधाएँ प्रदान करता है।
ग्रेग हेविल जिल

4
@ जोसेफ: दो रिपोज का उपयोग करना तभी उचित है जब दो कोड बेस के संस्करण एक दूसरे से लगभग स्वतंत्र हों। अगर ऐसा नहीं है, तो ग्रेग ने जो लिखा है उसे करने के लिए मैं दृढ़ता से सिफारिश करूंगा और सब कुछ एक रेपो में रखूंगा। केवल एक चीज जो मैं पुनर्विचार करूंगा वह है "सी प्रीप्रोसेसर" का उपयोग। मुझे लगता है कि आपकी पसंद की भाषा में लिखी गई एक छोटी सी स्क्रिप्ट (PHP ही ठीक है, पर्ल या पायथन और भी बेहतर है) जो आपके कोड की एक प्रति बनाती है (कुछ चिन्हित किए बिना) प्रीमियम फीचर्स को ट्रिक करती है।
डॉक ब्राउन

8

हम 2 अलग-अलग प्रोजेक्ट्स का उपयोग कर रहे हैं, एक बेसिक और एक प्रीमियम जो बेसिक प्रोजेक्ट पर निर्भर करता है। ब्रेक का उपयोग न करें, वे आमतौर पर सुविधाओं के लिए उपयोग किए जाते हैं।


यह मुझे अपील करता है, क्योंकि आप अपनी बिल्ड स्क्रिप्ट का उपयोग बुनियादी और प्रीमियम दोनों कार्यक्रमों के निर्माण को स्वचालित करने के लिए कर सकते हैं।
नेणतापीर

1
सामान्य स्थिति में आपको 3 परियोजनाओं की आवश्यकता होती है: सामान्य भाग, जिसे अक्सर लाइब्रेरी के रूप में व्यवस्थित किया जाता है, और दो अलग-अलग संस्करणों के लिए कस्टम भाग।
एंड्री टायलेको

3

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

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

ग्रेग के जवाब ने सुझाव दिया कि आप "उन चीजों के लिए शाखाओं पर विचार करें जो (या हो सकती हैं) बाद में फिर से एक साथ विलय कर दी जाती हैं"। जिस दृष्टिकोण के साथ मैंने अभी वर्णन किया है, यह मामला है, सिवाय इसके कि सभी कमिट्स के लिए अंतिम शाखा master-premiumनहीं होगी master(जो वास्तव में है master-basic)।

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


0

"हार्डवेयर" में यह अक्सर किया जाता है, वे गड़बड़ को नियंत्रित करने के लिए बेची जाने वाली प्रणाली हैं, क्षमा करें मुझे याद नहीं है कि उन्हें क्या कहा जाता है।

एक बार जब "मिड रेंज" वॉशिंग मशीन जहाज, यह कोड एक बहुत ही महत्वपूर्ण बग फिक्स के अलावा अन्य परिवर्तन नहीं होता है, तब भी जब समान कोड "कम अंत" वॉशिंग मशीन में बदल जाता है जो कुछ महीने बाद जहाज करता है।

ग्राहक ऐसी वॉशिंग मशीन में अपग्रेड पाने की उम्मीद नहीं करते हैं जो वे पहले ही ला चुके हैं, एक नया मॉडल भी हर कुछ महीनों में शिप नहीं किया जाता है।

हम में से अधिकांश उस दुनिया में नहीं रहते हैं, इसलिए ग्रेग कहते हैं कि जब तक आप वॉशिंग मशीन के लिए सॉफ्टवेयर नहीं लिख रहे हैं।

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