2013-05-09 8 views
10

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

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

उदाहरण के लिए (मैं स्पष्ट रूप से इन चर्चा की खातिर सरल बना दिया है):

शाखा ए: डेवलपर 1 एक 'एड-UserDateCreated' माइग्रेशन जो उपयोगकर्ता संस्था के लिए एक क्षेत्र कहते हैं कहते हैं। माइग्रेशन फ़ाइल में फ़ील्ड जोड़ने के लिए कोड होता है, और उस समय मॉडल स्थिति होती है।

शाखा बी: डेवलपर 2 'एड-यूजर मिडलनाम' माइग्रेशन जोड़ता है जो उपयोगकर्ता इकाई में एक और फ़ील्ड जोड़ता है। माइग्रेशन फ़ाइल में फ़ील्ड जोड़ने के लिए कोड होता है, और उस समय मॉडल स्थिति होती है (लेकिन जाहिर है कि अन्य माइग्रेशन में फ़ील्ड जोड़ा नहीं गया है)।

ये प्रवास उनकी शाखाओं पर अच्छा काम है, लेकिन जब आप उन्हें वापस ट्रंक में विलय, आप अटक:

  • तुम बस संग्रहीत मॉडल राज्य के रूप में अलग माइग्रेशन फ़ाइलों को रखना नहीं कर सकते नहीं सही हो उदाहरण के लिए, 'एड-यूजर मिडलनाम' माइग्रेशन में 'एड-यूजरडेटेडेटेड' फ़ील्ड के साथ मॉडल की स्थिति होनी चाहिए - लेकिन ऐसा नहीं होगा।
  • आप एक फाइल में माइग्रेशन मर्ज नहीं कर सकते के रूप में आप एक ही मुद्दा मारा *

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

तो अन्य लोग इस तरह की स्थितियों का प्रबंधन कैसे करते हैं? मैं अन्य लोगों की राय जानना उत्सुक हूं।

* मुझे उत्सुकता है कि वास्तव में असली दुनिया में क्या समस्याएं पैदा होंगी, अगर कोई जानता है?

उत्तर

5

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

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

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

मुझे यह भी पता चलता है कि माइग्रेशन छोटे हैं, जिससे उन्हें आसानी से शाखाओं के बीच पोर्टेबल बना दिया जाता है।

यह भी ध्यान दिया जाना चाहिए कि यह एक संस्करण नियंत्रण प्रणाली का उपयोग करने में मदद करता है जो कि ब्रितिंग, विलय और चेरी-पिकिंग के साथ अच्छा है, उदाहरण के लिए।

+0

धन्यवाद मार्टिन - यह करने का यह एक और उपयोगी तरीका है। मुझे लगता है कि मैंने पहले कभी इस तरह के बदलावों को विलय करने के बारे में सोचा नहीं था, आम तौर पर सभी परिवर्तनों को फिर से बनाने के लिए सभी माइग्रेशन को फिर से बनाने का विकल्प चुनते हैं जब सभी परिवर्तन ट्रंक में वापस विलय हो जाते हैं। मुझे लगता है कि सवाल यह है कि कौन सा तरीका बेहतर है? :) – stevehayter

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