2009-05-01 8 views
6

प्रति कई releated क्षुधा या एक "परियोजना 'वाले मैं युक्त ट्रंक, शाखाओं, टैग उप dirs एक SVN निर्देशिका के रूप में एक परियोजना को परिभाषितकैसे दानेदार अपने SVN "परियोजनाओं" कर रहे हैं:। एक बड़ी परियोजना एप्लिकेशन

क्या मानदंड जब आप किसी प्रोजेक्ट को दो में विभाजित करते हैं या कई परियोजनाओं को एक में एकीकृत करते हैं, तो यह निर्धारित करते समय आप उपयोग करते हैं? - आम स्रोत और संसाधनों के लिए साझा परियोजनाओं के साथ एक "परियोजना" प्रति एक ऐप? - सभी स्रोतों और संसाधनों वाली एक बड़ी "परियोजना" ऐप के लिए?

एकल परियोजना या बहु परियोजना दोनों में उनके प्लस और माइनस हैं। हम mo एक परियोजना की ओर फिर से और मैं यह पता लगाने की कोशिश कर रहा हूं कि यह सही दृष्टिकोण है या नहीं।

विभाजन परियोजनाएं इस बात को नियंत्रित करने की अधिक क्षमता देती हैं कि सुइट के विभिन्न हिस्सों में परिवर्तन कैसे शामिल है। सामान्य पुस्तकालय संस्करण हो सकता है और विभिन्न अनुप्रयोगों को एक विशिष्ट संस्करण (मेवेन डेप प्रबंधन दृष्टिकोण) का उपयोग करने के लिए चुना जा सकता है।

स्प्लिट प्रोजेक्ट कई वर्ग पदानुक्रमों को भी बनाता है जो कोड को पूरी तरह समझने और संभावित रूप से कोड डुप्लिकेशन के लिए समझने में अधिक कठिन बनाते हैं। मैं मानता हूं कि समग्र संरचना का उचित डिजाइन और घटकों के बीच संबंध इस लागत के प्रबंधन के लिए महत्वपूर्ण होंगे।

एक एकीकृत परियोजना दृष्टिकोण डेवलपर पर वर्कस्पेस स्थापित करने के मामले में आसान बनाता है, और एक एकल श्रेणी पदानुक्रम प्रदान करता है। यह एक डबल तलवार वाली तलवार है क्योंकि यह डेवलपर पर अधिक जानकारी भी फेंक देगी (समझने के लिए बहुत सी कक्षाएं)।

तो, जब आप यह तय करने की कोशिश कर रहे हैं कि कहां गठबंधन करना है और कहां विभाजित करना है, तो अंगूठे के नियम आप किस प्रकार उपयोग करते हैं?

उत्तर

0

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

हम स्रोत लेआउट को दोबारा प्रतिक्रिया देंगे जैसे कि हम स्रोत को दोबारा प्रतिक्रिया देंगे। जब एक परियोजना एक परिधि और निर्भरता की स्थिति से "खराब गंध" शुरू होती है तो हम इसे तोड़ देंगे, लेकिन इससे पहले नहीं। मैं अंतरिक्ष में परिधि के समय में परिधि का उपयोग नहीं करूंगा: & परीक्षण, चेकआउट के लिए समय बनाने का समय। अगर मेरे पास 1 जीबी पेड़ है तो मैं < 10 मिनट में चेकआउट कर सकता हूं और < 30 मिनट में बिल्ड/टेस्ट कर सकता हूं, मुझे इसे तब तक तोड़ने की ज़रूरत नहीं है जब तक कि मुझे इसके हिस्सों को अक्सर जारी करने की आवश्यकता न हो।

तो, इनपुट के लिए धन्यवाद। यह मेरी टीम के लिए सवाल तैयार करने और विकल्पों का मूल्यांकन करने में वास्तव में सहायक था।

1

मैं अलग-अलग परियोजनाओं का उपयोग करता हूं और उन्हें svn: externals के माध्यम से समाधान बनाने के लिए जोड़ता हूं।

3

SVN Book दोनों दृष्टिकोणों पर एक अच्छी चर्चा है।

अंत में मैं जो भी भंडार उपयोगकर्ताओं को अधिक प्राकृतिक महसूस करता हूं चुनता हूं।

व्यक्तिगत रूप से, मैंने अपने सभी वास्तविक कोड प्रोजेक्ट्स के साथ उन सभी के अंदर एक एकल एसवीएन ट्रंक/टैग/शाखा दृष्टिकोण का पक्ष लिया है।

हालांकि, एक बड़े कोड-बेस के लिए (मैंने केवल 3-4 छोटी परियोजनाओं को प्रबंधित किया है जो एक समाधान का हिस्सा थे), मैं अत्यधिक विभाजित दृष्टिकोण में बदलने पर विचार करता हूं।

4

हम रखरखाव की आसानी के लिए केवल एक एसवीएन प्रतिनिधि के भीतर एक ही ऐप से संबंधित सभी परियोजनाओं को डालते हैं, केवल एक भंडार में ऐप के कोड बेस को केंद्रीकृत करते हैं और ऐप के विभिन्न संसाधनों के बीच परस्पर निर्भरताओं को प्रबंधित करने की क्षमता भी रखते हैं।

हम आम तौर पर ट्रंक के भीतर विभिन्न संसाधनों में हमारे संसाधनों को वर्गीकृत करते हैं। वह वर्गीकरण प्राथमिक रूप से कार्यात्मक/मॉड्यूलर समूह या स्तरित समूह [डीएएल, बीएलएल, जीयूआई, आदि] पर आधारित है। यह पूरी तरह से है कि आपने कोड को कैसे संरचित किया है। उम्मीद है की यह मदद करेगा।

+0

एक SVN प्रतिनिधि के लिए एक अन्य कारण उपयोगकर्ता को बनाए रखने में आसानी है (प्रत्येक subproject अलग-अलग ट्रैक करने के लिए हमारी आवश्यकता के साथ फिट नहीं करता है) एसवीएन रेपो के लिए अनुमतियां। – Vikram

2

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

मैं एक "व्यक्तिगत" भंडार भी बनाए रखता हूं जहां लोग अपने परीक्षण कार्यक्रमों को एक-बंद उपयोगिताओं, या अन्य चीजों को स्टोर कर सकते हैं जो स्रोत नियंत्रण और केंद्रीकृत बैकअप से लाभ उठा सकते हैं, लेकिन यह एक स्वतंत्र परियोजना के रूप में नहीं है।

1

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

आपको उचित परीक्षण सूट और सीआई प्रथाओं का स्पष्ट रूप से परिभाषित करके एकीकरण परीक्षण करना चाहिए, न कि अगर आपका भाग आधे कोड पर निर्भर करता है तो अचानक एक भाग टूट जाता है।

एकल uber-project होने के साथ एक और समस्या यह है कि यह गिट-एसवीएन उपयोगकर्ताओं के लिए बहुत कठिन है जो केवल एक मॉड्यूल पर काम करते हैं।

0

अलग-अलग परियोजनाओं के लिए अलग एसवीएन भंडार रखें। आखिरी चीज जो आप चाहते हैं वह Merge Day

+0

मर्ज डे लेख एक मूर्खता में कई परियोजनाओं को रखने की बुराइयों के बजाय मूर्खता के बारे में अधिक है। –

1

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

प्रत्येक एप्लिकेशन को ट्रंक/टैग/शाखाओं के साथ अपना स्वयं का फ़ोल्डर मिलता है। यदि किसी एप्लिकेशन के भीतर कोई प्रोजेक्ट वास्तव में बड़ा हो जाता है, तो इसे अपने स्वयं के अलग फ़ोल्डर में धक्का दिया जाता है और इसे बिल्ड समय (या यहां तक ​​कि svn: externals) पर एप्लिकेशन से जोड़ा जा सकता है।

यह कहा गया है कि, यदि आपकी परियोजना आवश्यकताओं को 10 डेवलपर्स द्वारा लिखित जटिल अनुप्रयोग विकसित करना है और आप द्वारपाल हैं या मास्टर बनाते हैं तो आप अधिक जटिल विकल्पों पर विचार कर सकते हैं।

+0

मुझे नहीं लगता कि प्री-ऑप्टिमाइज़ेशन उन्नत रूप से एक संगठन योजना की योजना बनाने जैसा ही है। –

+0

यह डोनाल्ड नुथ जो टिप्पणी "सभी बुराई की जड़" बना दिया था: https://en.wikipedia.org/wiki/Program_optimization#When_to_optimize –

0

यहां कोई 'अच्छा' जवाब नहीं है, लेकिन मुझे लगता है कि एसवीएन रिपोज़ के बीच एक भेद होना चाहिए जिसमें 1 या 2 परियोजनाएं हों, और अन्य जिनमें 100 शामिल हों।

मैं एक एसवीएन रेपो बनाए रखता हूं जिसे वीएसएस से माइग्रेट किया गया था, इसमें कई सौ परियोजनाएं हैं, उनमें से कोई भी ट्रंक/शाखा/टैग संरचना के साथ व्यवस्थित नहीं हुआ है (वास्तव में मुझे लगता है कि संरचना वास्तव में अनावश्यक है और कुछ समय के लिए मैंने एसवीएन का उपयोग करने के बाद अनुपयोगी, यह निश्चित रूप से मदद नहीं करता है जब आपको 2 या 3 परियोजनाओं को एक ही बदलाव के रूप में टैग करना होता है)।

हम अपने सभी बनाए रखे गए सॉफ़्टवेयर के लिए एक प्रोजेक्ट निर्देशिका बनाए रखते हैं, जिसके अंतर्गत हमारे पास कॉन्फ़िगरेशन के लिए उपनिवेश हैं और दूसरा स्रोत के लिए है। उन लोगों के तहत हमारे पास उत्पाद संस्करण संख्याएं हैं - इसलिए प्रभावी रूप से हम ट्रंक की अवधारणा को फेंक रहे हैं, हमारे पास केवल टैग निर्देशिकाएं हैं - सबसे अधिक संख्या ट्रंक है (हमें ऐसा करना है क्योंकि हमें परियोजनाओं के कई संस्करणों को एक साथ समर्थन देना है)। विलय की आवश्यकता होती है, इसलिए यदि मैं प्रोजेक्ट ए, संस्करण 3.0 में एक बग अपडेट करता हूं; मैं उन परिवर्तनों को संस्करण 4.0 और v5.0 में विलय कर दूंगा।

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

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

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

तो किसी न किसी में संक्षेप में प्रस्तुत करने, हम इस तरह एक निर्देशिका संरचना है जहां v1 और v2 उत्पाद संस्करण हैं:

maint/source/v1.0/projectA 
maint/source/v1.0/projectB 
maint/source/v2.0/projectA 
maint/source/v2.0/projectB 
etc 
जाहिर

, हम के तहत 'स्रोत' एक शाखा dir, और एक शाखा/टैग डाल सकता है प्रत्येक सबप्रोजेक्ट के तहत भी लेकिन यह मुश्किल हो जाएगा अगर हमें एक ही परिवर्तन अनुरोध के रूप में 2 सबप्रोजेक्ट्स को रिलीज़ करने की आवश्यकता होती है (जैसा कि हम अक्सर करते हैं)। स्रोत निर्देशिका के तहत एक टैग subdir लाना हम सभी को टैग का मतलब होगा, जब केवल एक ही subproject बदल गया

संबंधित मुद्दे