यदि आप नीचे मेरी सिफारिशों का पालन करते हैं (मेरे पास वर्षों के लिए है), तो आप कर पाएंगे:
- प्रत्येक परियोजना को स्रोत नियंत्रण में कहीं भी रख दें, जब तक आप प्रोजेक्ट रूट डायरेक्टरी से नीचे की ओर संरचना को संरक्षित नहीं करते हैं
- न्यूनतम जोखिम और न्यूनतम तैयारी के साथ, किसी भी मशीन पर कहीं भी प्रत्येक परियोजना का निर्माण करें
- जब तक आप इसकी बाइनरी निर्भरता (स्थानीय "पुस्तकालय" और "आउटपुट" निर्देशिकाओं तक पहुंच) तक प्रत्येक प्रोजेक्ट को पूरी तरह से अकेले खड़े करें;
- निर्माण और परियोजनाओं के किसी भी संयोजन के साथ काम करते हैं, क्योंकि वे स्वतंत्र हैं
- निर्माण और एक ही परियोजना के कई प्रतियों / संस्करणों के साथ काम करते हैं, क्योंकि वे स्वतंत्र हैं
- उत्पन्न फ़ाइलों या पुस्तकालयों के साथ अपने स्रोत नियंत्रण भंडार को अव्यवस्थित करने से बचें
मैं सलाह देता हूं (यहां गोमांस है):
एकल प्राथमिक सुपुर्दगी, जैसे .DLL, .EXE, या .JAR (विज़ुअल स्टूडियो के साथ डिफ़ॉल्ट) का निर्माण करने के लिए प्रत्येक प्रोजेक्ट को परिभाषित करें।
एक जड़ के साथ एक पेड़ के रूप में प्रत्येक परियोजना की संरचना।
अपनी रूट डायरेक्टरी में प्रत्येक प्रोजेक्ट के लिए एक स्वचालित बिल्ड स्क्रिप्ट बनाएं जो इसे IDE पर NO निर्भरता के साथ, खरोंच से बनाएगी (लेकिन संभव होने पर IDE में निर्मित होने से नहीं रोकती)।
विंडोज पर .NET प्रॉजेक्ट्स के लिए nAnt पर विचार करें, या आपके ओएस, टारगेट प्लेटफॉर्म आदि के आधार पर कुछ इसी तरह का।
हर प्रोजेक्ट को स्क्रिप्ट के संदर्भ में अपनी बाहरी (3-पार्टी) निर्भरता को एक एकल स्थानीय साझा "लाइब्रेरी" निर्देशिका से बनाएं, हर ऐसे बाइनरी पूरी तरह से संस्करण द्वारा पहचाना जाता है: %DirLibraryRoot%\ComponentA-1.2.3.4.dll
, %DirLibraryRoot%\ComponentB-5.6.7.8.dll
।
प्रत्येक प्रोजेक्ट बिल्ड स्क्रिप्ट को एक स्थानीय साझा "आउटपुट" निर्देशिका में प्राथमिक सुपुर्दगी को प्रकाशित करें: %DirOutputRoot%\ProjectA-9.10.11.12.dll
, %DirOutputRoot%\ProjectB-13.14.15.16.exe
।
हर प्रोजेक्ट का निर्माण स्क्रिप्ट के संदर्भ में "लाइब्रेरी" और "आउटपुट" डायरेक्टरीज़ और "पूरी तरह से पूर्ण पथ (ऊपर देखें)" के माध्यम से निर्भरता को दर्शाता है।
कभी भी किसी परियोजना को किसी अन्य परियोजना या उसकी किसी भी सामग्री का संदर्भ न दें - केवल "आउटपुट" निर्देशिका में प्राथमिक डिलिवरेबल्स के संदर्भ की अनुमति दें (ऊपर देखें)।
हर प्रोजेक्ट को स्क्रिप्ट के संदर्भ में इसके आवश्यक बिल्ड टूल्स को एक विन्यास योग्य और पूर्ण-संस्करण वाले पूर्ण पथ द्वारा बनाएं: %DirToolRoot%\ToolA\1.2.3.4
, %DirToolRoot%\ToolB\5.6.7.8
।
प्रोजेक्ट रूट डायरेक्टरी के सापेक्ष निरपेक्ष पथ द्वारा प्रत्येक प्रोजेक्ट बिल्ड स्क्रिप्ट संदर्भ स्रोत सामग्री बनाएं: ( ${project.base.dir}/src
, ${project.base.dir}/tst
बिल्ड टूल द्वारा सिंटैक्स भिन्न होता है)।
ALWAYS को एक प्रोजेक्ट बिल्ड स्क्रिप्ट की आवश्यकता होती है जो किसी फ़ाइल या निर्देशिका को एक निरपेक्ष, विन्यास योग्य पथ (एक विन्यास योग्य चर द्वारा निर्दिष्ट निर्देशिका में निहित) के माध्यम से संदर्भित करने के लिए: ${project.base.dir}/some/dirs
या ${env.Variable}/other/dir
।
कभी भी किसी प्रोजेक्ट को स्क्रिप्ट बनाने की अनुमति दें जैसे कि किसी रिश्तेदार पथ के साथ कुछ भी संदर्भित करने के लिए .\some\dirs\here
या ..\some\more\dirs
, हमेशा पूर्ण पथ का उपयोग करें।
कभी भी किसी प्रोजेक्ट को स्क्रिप्ट का निर्माण करने की अनुमति दें ताकि किसी ऐसे पथ का उपयोग किया जा सके, जिसके पास एक विन्यास योग्य रूट डायरेक्टरी न हो, जैसे C:\some\dirs\here
या \\server\share\more\stuff\there
।
प्रोजेक्ट बिल्ड स्क्रिप्ट द्वारा संदर्भित प्रत्येक कॉन्फ़िगर करने योग्य रूट निर्देशिका के लिए, उन संदर्भों के लिए उपयोग किए जाने वाले परिवेश चर को परिभाषित करें।
प्रत्येक मशीन को कॉन्फ़िगर करने के लिए आपको आवश्यक पर्यावरण चर की संख्या को कम करने का प्रयास करना चाहिए।
प्रत्येक मशीन पर, एक शेल स्क्रिप्ट बनाएं जो आवश्यक पर्यावरण चर को परिभाषित करता है, जो कि THAT मशीन के लिए विशिष्ट है (और संभवतः उस उपयोगकर्ता के लिए विशिष्ट है, यदि प्रासंगिक हो)।
मशीन-विशिष्ट कॉन्फ़िगरेशन शेल स्क्रिप्ट को स्रोत नियंत्रण में न रखें; इसके बजाय, प्रत्येक परियोजना के लिए, टेम्पलेट के रूप में प्रोजेक्ट रूट डायरेक्टरी में स्क्रिप्ट की एक प्रति दें।
प्रत्येक प्रोजेक्ट को अपने प्रत्येक पर्यावरण चर की जाँच करने के लिए स्क्रिप्ट का निर्माण करें, और यदि वे परिभाषित नहीं हैं तो एक सार्थक संदेश के साथ गर्भपात करें।
प्रत्येक प्रोजेक्ट के निर्माण की स्क्रिप्ट को उसके प्रत्येक आश्रित निर्माण उपकरण निष्पादक, बाहरी लाइब्रेरी फ़ाइलों और आश्रित परियोजना को डिलीवर करने योग्य फ़ाइलों की जाँच करने के लिए और उन फ़ाइलों के मौजूद न होने पर एक सार्थक संदेश के साथ निरस्त करें।
स्रोत नियंत्रण में किसी भी उत्पन्न फ़ाइलों को करने के लिए प्रलोभन प्राप्त करें - कोई प्रोजेक्ट डिलिवरेबल्स, कोई उत्पन्न स्रोत, कोई उत्पन्न डॉक्स आदि नहीं।
यदि आप एक आईडीई का उपयोग करते हैं, तो आप जो भी प्रोजेक्ट कंट्रोल फाइल कर सकते हैं, उसे उत्पन्न करें और उन्हें स्रोत नियंत्रण के लिए प्रतिबद्ध न करें (इसमें विजुअल स्टूडियो प्रोजेक्ट फाइलें शामिल हैं)।
सभी बाहरी पुस्तकालयों और उपकरणों की आधिकारिक प्रतिलिपि के साथ एक सर्वर स्थापित करें, जिसे डेवलपर वर्कस्टेशन पर कॉपी / इंस्टॉल किया जाए और मशीनों का निर्माण किया जाए। अपने स्रोत नियंत्रण भंडार के साथ इसे वापस करें।
कोई भी विकास उपकरण जो भी हो, एक निरंतर एकीकरण सर्वर (बिल्ड मशीन) स्थापित करें।
अपने बाहरी पुस्तकालयों और डिलिवरेबल्स के प्रबंधन के लिए एक उपकरण पर विचार करें, जैसे कि आइवी (चींटी के साथ इस्तेमाल किया गया)।
मावेन का उपयोग न करें - यह शुरू में आपको खुश कर देगा, और अंततः आपको रोने देगा।
ध्यान दें कि इसमें से कोई भी तोड़फोड़ के लिए विशिष्ट नहीं है, और इसका अधिकांश हिस्सा किसी भी ओएस, हार्डवेयर, प्लेटफॉर्म, भाषा आदि पर लक्षित परियोजनाओं के लिए सामान्य है। मैंने ओएस का थोड़ा उपयोग किया है और टूल-विशिष्ट सिंटैक्स, लेकिन केवल उदाहरण के लिए- -मुझे भरोसा है कि आप अपने ओएस या पसंद के टूल में अनुवाद करेंगे।
विज़ुअल स्टूडियो समाधान के बारे में अतिरिक्त नोट: उन्हें स्रोत नियंत्रण में न रखें! इस दृष्टिकोण के साथ, आपको उनकी बिल्कुल आवश्यकता नहीं है या आप उन्हें (विजुअल स्टूडियो प्रोजेक्ट फाइलों की तरह) उत्पन्न कर सकते हैं। हालांकि, मुझे व्यक्तिगत डेवलपर्स के लिए समाधान फ़ाइलों को छोड़ने / उपयोग करने के लिए सबसे अच्छा लगता है क्योंकि वे फिट दिखते हैं (लेकिन स्रोत नियंत्रण के लिए जाँच नहीं की जाती)। मैं Rob.sln
अपने कार्य केंद्र पर एक फ़ाइल रखता हूं जिसमें से मैं अपनी वर्तमान परियोजना का संदर्भ देता हूं। चूंकि मेरी परियोजनाएं पूरी तरह से अकेली हैं, इसलिए मैं अपनी इच्छानुसार परियोजनाओं को जोड़ / हटा सकता हूं (इसका मतलब है कि कोई परियोजना-आधारित निर्भरता संदर्भ नहीं)।
कृपया सबवर्सन एक्सटर्नल (या अन्य उपकरणों में समान) का उपयोग न करें, वे एक विरोधी पैटर्न हैं और इसलिए, अनावश्यक हैं।
जब आप निरंतर एकीकरण को लागू करते हैं, या यहां तक कि जब आप सिर्फ रिलीज प्रक्रिया को स्वचालित करना चाहते हैं, तो इसके लिए एक स्क्रिप्ट बनाएं। एकल शेल स्क्रिप्ट बनाएं जो प्रोजेक्ट नाम (रिपॉजिटरी में सूचीबद्ध) और टैग नाम के मापदंडों को लेता है, एक कॉन्फ़िगर करने योग्य रूट डायरेक्टरी के भीतर एक अस्थायी निर्देशिका बनाता है, दिए गए प्रोजेक्ट के नाम और टैग नाम के लिए स्रोत की जांच करता है (निर्माण करके) उस अस्थायी निर्देशिका को) तोड़फोड़ के मामले में उपयुक्त यूआरएल, एक साफ निर्माण करता है जो परीक्षण चलाता है और वितरण योग्य पैकेज करता है। यह शेल स्क्रिप्ट किसी भी प्रोजेक्ट पर काम करना चाहिए और आपके "बिल्ड टूल्स" प्रोजेक्ट के हिस्से के रूप में स्रोत नियंत्रण में जांच की जानी चाहिए। आपका निरंतर एकीकरण सर्वर इस स्क्रिप्ट का उपयोग परियोजनाओं के निर्माण के लिए इसकी नींव के रूप में कर सकता है, या यह इसे प्रदान भी कर सकता है (लेकिन आप अभी भी अपना खुद का चाहते हैं)।
@VonC: जब आप अपनी बिल्ड स्क्रिप्ट को तोड़ते हैं तो आप जलने के बाद "एंट-एब्जार्जर" के बजाय "एंटी.जर" के साथ हर समय काम नहीं करना चाहते हैं क्योंकि आप अनजाने में चींटी के असंगत संस्करण के साथ इसे चलाते हैं। यह विशेष रूप से चींटी 1.6.5 और 1.7.0 के बीच आम है। सामान्यीकरण करते हुए, आप हमेशा जानना चाहते हैं कि आपके प्लेटफॉर्म (जावा एबीसीडी) और आपके बिल्ड टूल (एंट ईएफजीएच) सहित हर घटक के किस विशिष्ट संस्करण का उपयोग किया जा रहा है। अन्यथा, आप अंततः एक बग का सामना करेंगे और आपकी पहली BIG समस्या नीचे ट्रैक कर रही होगी कि आपके विभिन्न घटकों के कौन से संस्करण शामिल हैं। यह बेहतर है कि सामने वाले की समस्या को हल किया जाए।