दिलचस्प पोस्ट
MySQL दो कॉलम को जोड़ती है और एक नए कॉलम में जोड़ता है डुप्लिकेट HTTP प्रतिसाद हेडर स्वीकार्य हैं? वास्तुकला MVC की तुलना में वेब एप्लिकेशन के लिए अधिक उपयुक्त है? सामान्य लैम्ब्डा सी ++ 14 में कैसे काम करता है? पीआईपी स्थापित- r: OSError: अनुमति अस्वीकृत JQuery के साथ चेकबॉक्स समूह के मान चुनें नामकरण कन्वेंशन सी # पाठ नोड्स के लिए कोई सीएसएस चयनकर्ता है? Mac OS X शेर पर पर्यावरण चर सेट करें जीसीसी एक * ए * ए * ए * ए * ए (ए * ए * ए) * (ए * ए * ए) को क्यों अनुकूलित नहीं करता? <Ui: दोहराने> <h: inputText> का उपयोग करके एक सूची <स्ट्रिंग> मॉडल मान अपडेट नहीं करता है Excel: किसी SQL क्वेरी के लिए पैरामीटर के रूप में सेल मान का उपयोग करें क्या "स्थिर अंतिम लकड़हारा" को यूपीईआर-मामले में घोषित किया जाना चाहिए? चर के साथ awk का उपयोग करना उपयोगकर्ता-परिभाषित लिखे शब्द नई क्षमताओं को C ++ में जोड़ते हैं?

आप अपने संस्करण नियंत्रण भंडार को व्यवस्थित कैसे करते हैं?

सबसे पहले, मुझे इस बारे में पता है: घर सॉफ्टवेयर प्रोजेक्ट्स में आप सबवर्जन रिपॉजिटरी का आयोजन कैसे करेंगे? अगला, वास्तविक प्रश्न: मेरी टीम हमारे रिपॉजिटरी का पुनर्गठन कर रही है और मैं इसे व्यवस्थित करने के संकेत के लिए देख रहा हूं। (इस मामले में एसवीएन)। यहाँ हम साथ क्या आया है हमारे पास एक रिपॉजिटरी, एकाधिक परियोजनाएं और एकाधिक svn: बाहरी क्रॉस-रेफरेंस हैं

\commonTools /*tools used in all projects. Referenced in each project with svn:externals*/ \NUnit.v2.4.8 \NCover.v.1.5.8 \<other similar tools> \commonFiles /*settings strong name keys etc.*/ \ReSharper.settings \VisualStudio.settings \trash /*each member of the team has trash for samples, experiments etc*/ \user1 \user2 \projects \Solution1 /*Single actual project (Visual Studio Solution)*/ \trunk \src \Project1 /*Each sub-project resulting in single .dll or .exe*/ \Project2 \lib \tools \tests \Solution1.sln \tags \branches \Solution2 \trunk \src \Project3 /*Each sub-project resulting in single .dll or .exe*/ \Project1 /*Project1 from Solution1 references with svn:externals*/ \lib \tools \tests \Solution2.sln \tags \branches 

शब्दावली को साफ़ करने के लिए: समाधान एक उत्पाद का मतलब है, प्रोजेक्ट एक विज़ुअल स्टूडियो प्रोजेक्ट है (जिसका परिणाम एक सिंगल .DLL या एकल .Exe में होता है)

इस तरह से हम रिपॉजिटरी को बाहर करने की योजना बनाते हैं। मुख्य मुद्दा यह है कि हमारे पास कई समाधान हैं, लेकिन हम परियोजनाओं के समाधान के बीच साझा करना चाहते हैं। हमने सोचा कि उन साझा परियोजनाओं को अपने स्वयं के समाधानों में स्थानांतरित करने में वास्तव में कोई मतलब नहीं है, और इसके बजाय हमने सोवियों के बीच परियोजनाओं को साझा करने के लिए svn: externals का उपयोग करने का निर्णय लिया है। हम भी उपकरण और तृतीय पक्ष पुस्तकालयों के सामान्य सेट को एक ही स्थान पर रिपॉजिटरी में रखना चाहते हैं, और उन्हें प्रत्येक समाधान में उन्हें svn: externals के साथ संदर्भ देते हैं।

आप इस लेआउट के बारे में क्या सोचते हैं? विशेष रूप से svn के उपयोग के बारे में: बाह्य यह एक आदर्श समाधान नहीं है, लेकिन सभी पेशेवरों और विपक्षों पर विचार कर रहा है, यह सबसे अच्छा है जो हम सोच सकते हैं। आपको इसे कैसे करना होगा?

वेब के समाधान से एकत्रित समाधान "आप अपने संस्करण नियंत्रण भंडार को व्यवस्थित कैसे करते हैं?"

यदि आप नीचे मेरी सिफारिशों का पालन करते हैं (मैं वर्षों के लिए है), तो आप निम्न में सक्षम होंगे:

– प्रत्येक परियोजना को स्रोत नियंत्रण में कहीं भी रखें, जब तक कि आप प्रोजेक्ट रूट डायरेक्टरी से नीचे की संरचना को संरक्षित करते हैं

– न्यूनतम जोखिम और न्यूनतम तैयारी के साथ किसी भी मशीन पर कहीं भी प्रत्येक प्रोजेक्ट का निर्माण करें

– प्रत्येक प्रोजेक्ट को पूरी तरह से अकेला बनाएं, जब तक कि आप अपनी बाइनरी निर्भरता (स्थानीय "लाइब्रेरी" और "आउटपुट" निर्देशिका) तक पहुंच प्राप्त करें

– परियोजनाओं के किसी भी संयोजन के साथ निर्माण और काम करते हैं, क्योंकि वे स्वतंत्र हैं

– एकल परियोजना के कई प्रतियों / संस्करणों के साथ निर्माण और काम करना, क्योंकि वे स्वतंत्र हैं

– जेनरेट फाइलों या लाइब्रेरीज़ के साथ अपने स्रोत कंट्रोल रिपॉज़िटरी को बंद करने से बचें

मैं सुझाता हूँ (यहाँ बीफ़ है):

  1. प्रत्येक प्रोजेक्ट को एक प्राथमिक वितरण योग्य, जैसे एक। डीएलएल, .EXE, या .JAR (विजुअल स्टूडियो के साथ डिफ़ॉल्ट) तैयार करने के लिए परिभाषित करें।

  2. प्रत्येक प्रोजेक्ट को एक रूट के साथ डायरेक्ट्री ट्री के रूप में संरचना करें।

  3. प्रत्येक प्रोजेक्ट को उसकी मूल निर्देशिका में एक स्वचालित बिल्ड स्क्रिप्ट बनाएं, जो इसे आईडीई पर कोई निर्भरता के साथ खरोंच से बनायेगा, लेकिन (यदि संभव हो तो IDE में निर्मित होने से इसे रोकना न दें)।

  4. विंडोज पर एनएटीटी प्रोजेक्ट्स के लिए एनएन्ट पर विचार करें, या आपके ओएस, लक्ष्य प्लेटफार्म आदि के आधार पर कुछ ऐसा ही है।

  5. प्रत्येक प्रोजेक्ट बिल्ड स्क्रिप्ट को एक स्थानीय साझा "लाइब्रेरी" निर्देशिका से अपनी बाहरी (तृतीय-पक्ष) निर्भरता को संदर्भित करें, प्रत्येक वर्जन द्वारा पूरी तरह से पहचाने जाने वाले प्रत्येक बाइनरी के साथ: %DirLibraryRoot%\ComponentA-1.2.3.4.dll , %DirLibraryRoot%\ComponentB-5.6.7.8.dll

  6. प्रत्येक प्रोजेक्ट बिल्ड स्क्रिप्ट को एक स्थानीय साझा "आउटपुट" डायरेक्टरी में %DirOutputRoot%\ProjectA-9.10.11.12.dll : %DirOutputRoot%\ProjectA-9.10.11.12.dll , %DirOutputRoot%\ProjectB-13.14.15.16.exe

  7. प्रत्येक प्रोजेक्ट बिल्ड स्क्रिप्ट को "लाइब्रेरी" और "आउटपुट" निर्देशिकाओं में कॉन्फ़िगर करने योग्य और पूर्ण रूप से पूर्ण किए गए पूर्ण पथ (ऊपर देखें) के माध्यम से इसकी निर्भरता को संदर्भित करें, और जहां कहीं नहीं है।

  8. कभी भी किसी परियोजना को सीधे किसी अन्य प्रोजेक्ट या इसके किसी भी सामग्री को संदर्भित न करें – केवल "आउटपुट" निर्देशिका (ऊपर देखें) में प्राथमिक डिलिवरेबल्स के संदर्भ को अनुमति दें।

  9. प्रत्येक प्रोजेक्ट बिल्ड स्क्रिप्ट को अपने आवश्यक बिल्ड टूल्स को %DirToolRoot%\ToolA\1.2.3.4 और पूर्ण- %DirToolRoot%\ToolA\1.2.3.4 पूर्ण पथ द्वारा %DirToolRoot%\ToolA\1.2.3.4 : %DirToolRoot%\ToolA\1.2.3.4 , %DirToolRoot%\ToolB\5.6.7.8

  10. प्रोजेक्ट रूट डायरेक्टरी के सापेक्ष प्रत्येक प्रोजेक्ट बिल्ड स्क्रिप्ट संदर्भ स्रोत सामग्री को एक पूर्ण पथ से बनाएं: ${project.base.dir}/src , ${project.base.dir}/tst (सिंटैक्स बिल्ड टूल द्वारा बदलता है)।

  11. हमेशा एक पूर्ण, विन्यास योग्य मार्ग के माध्यम से हर फाइल या निर्देशिका को संदर्भित करने के लिए प्रोजेक्ट बिल्ड स्क्रिप्ट की आवश्यकता होती है (कॉन्फ़िगर करने योग्य वेरिएबल द्वारा निर्दिष्ट निर्देशिका में निहित): ${project.base.dir}/some/dirs या ${env.Variable}/other/dir

  12. किसी परियोजना को स्क्रिप्ट को कभी भी रिश्तेदार पथ के साथ कुछ भी संदर्भित करने की अनुमति नहीं देता .\some\dirs\here या ..\some\more\dirs , हमेशा पूर्ण पथ का उपयोग करें

  13. किसी प्रोजेक्ट बिल्ड स्क्रिप्ट को किसी पूर्ण पथ का उपयोग करने के लिए कभी भी अनुमति देने की अनुमति नहीं देता है, जिसके पास कॉन्फ़िगर करने योग्य रूट निर्देशिका नहीं है, जैसे C:\some\dirs\here या \\server\share\more\stuff\there

  14. प्रोजेक्ट बिल्ड स्क्रिप्ट द्वारा संदर्भित प्रत्येक कॉन्फ़िगर योग्य रूट निर्देशिका के लिए, एक पर्यावरण चर परिभाषित करें जो उन संदर्भों के लिए उपयोग किया जाएगा।

  15. प्रत्येक मशीन को कॉन्फ़िगर करने के लिए आपको बनाना चाहिए पर्यावरण चर की संख्या को कम करने का प्रयास करना

  16. प्रत्येक मशीन पर, एक शेल स्क्रिप्ट बनाएं जो आवश्यक वातावरण चर को परिभाषित करता है, जो कि मशीन के लिए विशिष्ट है (और संभवतः उस उपयोगकर्ता के लिए विशिष्ट है, यदि प्रासंगिक हो)।

  17. मशीन-विशिष्ट विन्यास शैल स्क्रिप्ट को स्रोत नियंत्रण में न डालें; इसके बजाय, प्रत्येक प्रोजेक्ट के लिए, टेम्पलेट के रूप में प्रोजेक्ट रूट निर्देशिका में स्क्रिप्ट की प्रतिलिपि बनाएं।

  18. अपने प्रत्येक पर्यावरण चर को जांचने के लिए प्रत्येक प्रोजेक्ट बिल्ड स्क्रिप्ट की आवश्यकता होती है, और यदि वह परिभाषित नहीं हैं तो एक सार्थक संदेश के साथ निरस्त करें।

  19. प्रत्येक प्रोजेक्ट बिल्ड स्क्रिप्ट की आवश्यकता के लिए प्रत्येक अपने निर्भर बिल्ड टूल एक्जीक्यूटेबल्स, बाहरी लाइब्रेरी फ़ाइलों और आश्रित परियोजना डिलीवर करने योग्य फ़ाइलों को देखने के लिए, और उन फ़ाइलों को मौजूद नहीं होने पर एक सार्थक संदेश के साथ निरस्त करें।

  20. किसी भी उत्पन्न फ़ाइलों को स्रोत नियंत्रण में करने के लिए प्रलोभन को रोकें – कोई परियोजना डिलिवरेबल्स, कोई उत्पन्न स्रोत नहीं, कोई जनरेट किए गए डॉक्स आदि नहीं।

  21. यदि आप एक IDE का उपयोग करते हैं, तो आप जो भी प्रोजेक्ट कंट्रोल फ़ाइलें बना सकते हैं, और उन्हें स्रोत नियंत्रण (इन्हें भी दृश्य स्टूडियो प्रोजेक्ट फाइल शामिल करने के लिए) न करें।

  22. डेवलपर वर्कस्टेशंस पर कॉपी / इंस्टॉल करने के लिए सभी बाह्य पुस्तकालयों और उपकरणों की एक आधिकारिक प्रति के साथ एक सर्वर की स्थापना करें और मशीनों का निर्माण करें। इसे वापस अपने स्रोत नियंत्रण भंडार के साथ,

  23. किसी भी विकास उपकरण के साथ एक सतत एकीकरण सर्वर (बिल्ड मशीन) की स्थापना करें।

  24. अपने बाहरी पुस्तकालयों और डिलिवरेबल्स के प्रबंधन के लिए एक उपकरण पर विचार करें, जैसे आइवी (चींटी के साथ प्रयोग किया गया)।

  25. मेवेन का उपयोग न करें – यह आपको शुरू में खुश कर देगा, और आखिरकार आपको रोना होगा

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

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

कृपया उपवृत्त बाह्य (या अन्य उपकरण के समान) का उपयोग न करें, वे एक विरोधी-पैटर्न हैं और इसलिए अनावश्यक हैं।

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

@ VonC: जब आप अपनी बिल्ड स्क्रिप्ट टूट जाती हैं, तो आप "एंटी-एबीसीडार" की बजाय "एंटी-एबीसीडीजर" के बजाय "एंटी.जर" के साथ काम करना नहीं चाहते हैं क्योंकि आप अनजाने में चींटी के असंगत संस्करण के साथ भाग गए थे। चींटी 1.6.5 और 1.7.0 के बीच यह विशेष रूप से आम है। सामान्यीकरण, आप हमेशा जानना चाहते हैं कि आपके प्लेटफॉर्म (जावा एबीसीडी) और आपके बिल्ड टूल (एंट ईएफजीएच) सहित प्रत्येक घटक का विशिष्ट संस्करण उपयोग किया जा रहा है। अन्यथा, आपको अंततः एक बग का सामना करना होगा और आपकी पहली बड़ी समस्या यह जान जाएगी कि आपके विभिन्न घटकों के संस्करणों में क्या शामिल है। सामने की समस्या को हल करने के लिए यह बेहतर है

मेरा मानना ​​है कि सबवर्सियन का उपयोग करने वाले व्यावहारिक संस्करण नियंत्रण में आपके पास अपनी रिपॉजिटरी व्यवस्थित करने की आवश्यकता है।

हमने जो कुछ पोस्ट किया है उसके बारे में हमने लगभग ठीक से मिलान किया है हम सामान्य रूप का उपयोग करते हैं:

 \Project1 \Development (for active dev - what you've called "Trunk", containing everything about a project) \Branches (For older, still-evolving supported branches of the code) \Version1 \Version1.1 \Version2 \Documentation (For any accompanying documents that aren't version-specific 

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

मुझे लगता है कि प्रस्तावित संरचना का मुख्य नुकसान यह है कि साझा परियोजनाओं का केवल उन पहले समाधान के साथ संस्करण किया जाएगा जो उन्हें जोड़ा गया था (जब तक कि svn: बाहरी मैं कल्पना कर रहा हूं की तुलना में उन्माद है)। उदाहरण के लिए, जब आप सॉल्यूशन 2 की पहली रिलीज के लिए एक शाखा बनाते हैं, तो प्रोजेक्ट 1 को ब्रंच नहीं किया जाएगा क्योंकि यह Solution1 में रहता है अगर आपको बाद में उस शाखा से (QFE रिलीज) बनाने की आवश्यकता है, तो यह प्रोजेक्ट 1 के संस्करण के बजाय शाखा के समय प्रोजेक्ट 1 के नवीनतम संस्करण का उपयोग करेगा।

इस कारण से, एक या अधिक साझा समाधानों (और इस प्रकार आपके संरचना में शीर्ष स्तरीय निर्देशिका) में साझा परियोजनाओं को शामिल करने के लिए लाभप्रद हो सकता है और फिर उन्हें किसी भी समाधान के प्रत्येक रिलीज़ के साथ शाखाबद्ध कर सकते हैं।

यह सब एक रिपॉजिटरी में क्यों है? क्यों प्रत्येक परियोजना के लिए अलग भंडार नहीं है (मेरा मतलब है "समाधान")?

अच्छा, कम से कम मैंने एक-प्रोजेक्ट-प्रति-रिपोजिटरी-दृष्टिकोण के लिए उपयोग किया है। आपकी रिपॉजिटरी संरचना मेरे लिए अतिसंवेदनशील लगती है

और आप इस एक बड़े भंडार में कितने प्रोजेक्ट लगाएंगे? 2? 3? 10? 100?

और जब आप एक परियोजना के विकास को रद्द करते हैं तो आप क्या करते हैं? बस इसे रिपॉज़िटरी ट्री से हटा दें ताकि भविष्य में खोजना मुश्किल हो सके। या इसे हमेशा के लिए झूठ बोल छोड़ दो? या जब आप एक प्रोजेक्ट को दूसरे सर्वर पर ले जाना चाहते हैं?

और उन सभी संस्करणों की गड़बड़ी के बारे में क्या? एक प्रोजेक्ट की संस्करण संख्या 2, 10, 11 की तरह दिखती है, जबकि दूसरी 1, 3, 4, 5, 6, 7, 8, 9, 12 की तरह होती है …

शायद मैं मूर्ख हूं, लेकिन मुझे एक रिपोजिटरी प्रति एक परियोजना पसंद है।

संबंधित पथ समस्या में जोड़ने के लिए:

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

RE: सापेक्ष पथ और साझा फ़ाइल समस्या –

ऐसा लगता है कि यह svn विशिष्ट है, लेकिन यह एक समस्या नहीं है। एक अन्य व्यक्ति ने पहले से अलग रिपॉजिटरीज का उल्लेख किया है और संभवत: उस मामले का सबसे अच्छा समाधान हो सकता है, जहां आपके पास अन्य परियोजनाओं के मनमाने ढंग से अन्य परियोजनाओं का जिक्र है। ऐसे मामले में जहां आपके पास कोई साझा फाइल नहीं है, तो ओपी समाधान (साथ ही कई अन्य) ठीक काम करेंगे।

हम अभी भी यह काम कर रहे हैं और मेरे पास 3 अलग-अलग प्रयास (अलग-अलग क्लाइंट) हैं जो मुझे अभी हल करना है क्योंकि मैंने गैर-मौजूद या खराब वर्जन नियंत्रण स्थापित करने का फैसला लिया है।

मेरे पास एक समान लेआउट है, लेकिन मेरी ट्रंक, शाखाएं, शीर्ष पर सभी तरह से टैग करते हैं। इसलिए: / ट्रंक / मुख्य, / ट्रंक / यूटीआईएल, / ब्रांच / रिलीज / आदि।

यह वास्तव में आसान रहा जब हम अन्य संस्करण नियंत्रण प्रणालियों को बाहर करने की कोशिश करना चाहते थे क्योंकि अनुवाद टूल के कई बुनियादी पाठ्यपुस्तक एसवीएन लेआउट के साथ सर्वोत्तम काम करते थे।