2009-05-04 20 views
17

मेरे स्थितिकैसे कम करने के लिए MSBuild बार

सी # परियोजना मैं अब हम पर काम कर रहा हूँ में एक काफी बड़ा समाधान (80 + परियोजनाओं) है। अब 5 मिनट के समय का पुनर्निर्माण + Visual Studio 2008 से एमएसबिल्ड का उपयोग करके वास्तव में काफी समस्या हो रही है।

एक विश्लेषण मैं था पिछले हफ्ते यह पता चला कि अपने निर्माण के समय इस प्रकार खर्च किया गया था में: परियोजनाओं के लिए

  1. प्रतिलिपि बनाई जा रही फ़ाइलें और परियोजनाओं है कि यह इस पर निर्भर (CopyToLocal), आदि के लिए यह recopying (60%)

  2. एक पोस्टबिल्ड को डिकंपाइल/संकलन के लिए आमंत्रित करना। (20%)

  3. वास्तविक संकलन, आदि (20%)

'सामान्य' परियोजना bin\debug फ़ोल्डरों उत्पादन भी एक बाहरी निर्देशिका में प्रतिलिपि है मुख्य 'स्थापित करने के लिए से

अलावा कर लोडर कार्यक्रम।

  1. कॉपी:

    \loader\bin\loader.exe 
    
    \loader\plugin\plugin1\plugin1.dll 
    
    \loader\plugin\plugin1\somedependency.dll 
    

    मैं

    क्या बातें जाने के प्रयास में एक छोटे से तेजी से मैं निम्नलिखित के बारे में सोचा: मुख्य कार्यक्रम संरचना इस तरह एक सा है सभी फाइलें एक बड़ी बिन निर्देशिका में हैं और कॉपीटोलोकल का उपयोग न करें। मुझे यह पसंद नहीं है क्योंकि हम अब एक ही डीएलएल फाइलों के विभिन्न संस्करणों का उपयोग नहीं कर सकते हैं और मेरी बिन निर्देशिका काफी गड़बड़ हो रही है।

  2. Use parallelism (/m) for MSBuild। यह निर्माण के समय में केवल बहुत ही कम मदद करता है।

  3. उन परियोजनाओं के बीच निर्भरताओं को कम करने का प्रयास करें जो हमेशा एक अच्छी बात है।

  4. हार्डवेयर में निवेश करें। मुझे कुछ research on solid-state drives मिला, लेकिन यह आशाजनक प्रतीत नहीं होता है।

मेरा प्रश्न

मैंने यह भी देखा है कि जब मैं एक परियोजना मेरी निर्भरता पेड़ सब कुछ फिर से बनाना हो जाता है की जड़ में है कि में बदलाव करते हैं। भले ही परिवर्तन केवल 'निजी' भाग में था और परियोजना का इंटरफ़ेस नहीं बदला था।

क्या MSBuild निर्भर परियोजनाओं का एक टाइमस्टैम्प का उपयोग यह निर्धारित करने के लिए करता है कि किसी परियोजना को पुनर्निर्माण की आवश्यकता है या नहीं?

क्या यह एक अलग स्थिति में बदला जा सकता है? उदाहरण के लिए, फ़ाइल का चेकसम?

इस विशिष्ट सुझाव के अलावा मैं निश्चित रूप से निर्माण के समय को तेज बनाने के लिए सभी सुझावों की सराहना करता हूं।

+0

[सीआई बिल्ड समय (.NET) में सुधार करने के संभावित डुप्लिकेट] (http://stackoverflow.com/questions/8633313/improving-ci-build-time-net) –

उत्तर

3

हमारे पास भी बड़े समाधान हैं। बिल्ड और संकलन I/O के बारे में है।

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

हम समाधान फ़ोल्डरों परियोजना के समूह भागों में के साथ नगण्य किया गया है: यह यह अनलोड परियोजनाओं वे पर काम नहीं कर रहे करने के लिए devs के लिए आसान बनाता है।

/m शायद ही कभी .NET डीबग के साथ मदद करता है बनाता है। मैंने कुछ हफ्ते पहले परीक्षणों की एक श्रृंखला चलाई और मामूली मतभेद पाए। निष्कर्ष:

  • क्योंकि अपने निर्माण आई/ओ विवश, /मी उपयोग कर रहा है: 2-4 डिबग बनाता है मेरे लिए धीमी बनाता है।
  • रिलीज आमतौर पर बहुत तेज बनाता है।
  • कोड विश्लेषण में बहुत समय लगता है।

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

बिल्ड सर्वर पर, यह अधिक जटिल है। हम विभिन्न मशीनों पर बना हुआ समांतर CruiseControl.NET स्थापित करने की सोच रहे हैं। हम वीएसटीएस बिल्ड का उपयोग कर रहे हैं, लेकिन यह क्षैतिज रूप से स्केल करने के लिए बहुत महंगा (और समय लेने वाला) है।

विस्तार-उन्मुख लोगों के लिए मेरी संख्या। सबसे धीमे से सबसे तेज़, कॉन्फ़िगरेशन msbuild "bigsolution.sln"/target: प्रत्येक के बीच साफ़ करें।

  1. /मी: 4, कोड विश्लेषण 1:38
  2. /मी के साथ डीबग: 1, डिबग कोड विश्लेषण के साथ 1:30
  3. /मी: 4, कोई कोड विश्लेषण 01:30
  4. साथ डीबग
  5. /मी: 1, कोई कोड विश्लेषण 1:30
  6. /मी के साथ डीबग: 1, कोड विश्लेषण के साथ जारी: 1:30
  7. /मी: 4, कोड विश्लेषण के साथ जारी: 1:05
  8. /एम: 4, कोई कोड विश्लेषण के साथ रिलीज: 0:53
  9. पुनर्निर्माण या स्वच्छ बिना

समय बिल्ड: ~ 4-10 सेकंड

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मैं सॉलिड स्टेट ड्राइव को थोड़ा और अधिक देख सकता हूं। बिल्ड टाइम मेरे लिए एक बड़ा मुद्दा है क्योंकि मैं टीडीडी का उपयोग करना चाहता हूं और बहुत कम बनाना चाहता हूं;) –

1

MSBuild समय का निर्माण एक बहु-आयामी समस्या है। अच्छी खबर यह है कि इसे हल करना आसान है:

बिल्ड मशीन पर चल रही अधिकांश प्रक्रियाओं के विपरीत, सीपीयू, रैम और आई/ओ-कॉन्स्यूमिंग होने के लिए प्रक्रियाएं कुख्यात हैं। MSBuild बनाता को तेज करने के लिए एक सामान्य नुस्खा है "सबसे अच्छा मशीन पैसे खरीद सकते हैं पाने के", विशेष रूप से:

  1. सीपीयू - कम से कम दो इंटेल 3.0 GHz कोर 2 डुओ।

  2. रैम - कम से कम 4 जीबी डीडीआर 3। यदि यह एक डेवलपर और बिल्ड मशीन है, तो 64-बिट ओएस और 8   जीबी रैम एक बेहतर विकल्प है।

  3. एचडीडी - सबसे तेज़ विकल्प ऑन-बोर्ड बैटरी और एक सक्षम लेखन कैश के साथ एक उच्च अंत 3ware RAID-1 है। एक तेज़ एसएसडी विचार करने का एक और विकल्प हो सकता है।

  4. नेटवर्क - न्यूनतम 1   जीबीटी/एस कार्ड।

यह सरल हार्डवेयर अनुकूलन आपके MSBuilds को 2-3 बार बढ़ा सकता है।

22

मैं 500+ सी # आवेदन परियोजनाओं पर काम कर रहा हूं। परियोजनाएं समानांतर और प्रतिलिपि सेट में झूठी में संकलित की जाती हैं। संकलन समय लगभग 37   मिनट इकाई परीक्षण और कोड कवरेज के बिना है। कोड में किसी भी बदलाव के बिना वृद्धिशील निर्माण के लिए 13   मिनट।

यदि मैं समानांतर संकलन बंद करता हूं और कॉपीलोकल को सत्य पर सेट करता हूं, तो संकलन समय 1   एच 40   मिनट से अधिक है।

मेरे पास स्थानीय निर्माण, गेटेड चेक-इन बिल्ड और सर्वर तैनाती चरण (रात निर्माण) के साथ बनाता है के लिए अलग-अलग कॉन्फ़िगरेशन है।

यहाँ अपने अनुभवों हैं:

  1. प्रतिलिपि बनाई जा रही उत्पादन फ़ाइलों के लिए एक निर्देशिका अच्छा विचार नहीं है यदि आप समानांतर में अपनी परियोजनाओं के निर्माण के लिए CopyLocal बिना गलत पर सेट करना चाहते हैं। मेरी असेंबली को कभी-कभी लॉक किया जाता था जब कई परियोजनाओं ने एक ही असेंबली का संदर्भ दिया और एमएसबिल्ड ने इस संदर्भ को एक ही समय में आउटपुट फ़ोल्डर में कॉपी करने का प्रयास किया। This solution मेरे लिए बहुत उपयोगी था। मैंने सभी संदर्भों के लिए कॉपीलोकल को गलत पर सेट किया है और मेरा निर्माण निर्देशिका आकार 10x (10 गुना कम I/O) कम हो गया था। मेरे पास स्थानीय निर्माण और सर्वर निर्माण के लिए एक अलग सेटअप है। गेटेड चेक-इन निर्माण और पूर्ण तैनाती के निर्माण के लिए अलग-अलग सेटअप।
  2. यदि मैं समांतर निर्माण को सक्षम करता हूं, तो बिल्ड तेज, तेज़ होते हैं। यदि आपके पास मजबूत बिल्ड सर्वर है, तो /m:2 बिल्ड 0xबिल्ड के रूप में 2x तेज होना चाहिए। परियोजनाओं के बीच निर्भरताओं के साथ इसका कोई लेना-देना नहीं है (यदि प्रतिलिपि गलत पर सेट है)।
  3. यदि आप तेजी से वृद्धिशील निर्माण करना चाहते हैं तो आपको परियोजनाओं के बीच निर्भरताओं को कम करना चाहिए। इसका पूर्ण निर्माण (प्रतिलिपि झूठा) पर कोई प्रभाव नहीं पड़ता है। वृद्धिशील संकलन समय बिल्ड पेड़ में परिवर्तित परियोजना स्थान पर निर्भर करता है।

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

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

हमारा बिल्ड सर्वर एक वर्चुअल मशीन है, हार्डवेयर का असली टुकड़ा नहीं। बिल्ड सर्वर के लिए वीएम का उपयोग करना अच्छा नहीं है, लेकिन यह मेरा निर्णय नहीं था।

यदि आपके पास बहु जीबी रैम है तो इसे एक मेमोरी हार्ड ड्राइव के रूप में उपयोग करने का प्रयास करें। आपका निर्माण बहुत तेज़ होना चाहिए :)

एसएसडी ड्राइव प्रति दिन उच्च I/O के प्रति संवेदनशील हैं। इसका वारंटी पर असर पड़ता है।

मुझे आशा है कि यह किसी को मदद करता है ...;)

+0

आप इकाई/एकीकरण परीक्षण कैसे चलाते हैं? मुझे परीक्षणों के लिए कॉपीलोकल को सत्य पर सेट करने की आवश्यकता थी, इसलिए सभी आवश्यक डीएल परीक्षण बिन फ़ोल्डर में हैं। क्या आपको ऐसा करने की आवश्यकता के लिए समाधान मिला है? – ya23

+0

जोड़ें आपकी यूनिट परीक्षण परियोजनाओं में सभी संदर्भ और परियोजना संदर्भ टैग के लिए। – Ludwo

+0

मैं ऐसा कर सकता हूं और यह ठीक काम करेगा, लेकिन मैं परीक्षण चलाने में सक्षम नहीं होगा - .NET परीक्षण किए जाने वाले डीएलएल के फ़ोल्डर में निर्भर बाइनरी की तलाश में है। मैंने जांच और DEVPATH के बारे में पढ़ा है, लेकिन वे पर्याप्त अच्छे प्रतीत नहीं होते हैं - डीबग और रिलीज दोनों के निर्माण में समस्याएं बढ़ती हैं। जीएसी में सभी आवश्यक डीएलएस रखना काम करेगा, लेकिन यह पागल लगता है और वैसे भी एक विकल्प नहीं है। – ya23

0

यदि आपके पास पर्याप्त रैम मिला है और विज़ुअल सी का उपयोग कर रहे ++ (के बारे में सी # में निश्चित नहीं), आप पूरी कॉपी करने में शामिल हैं और एक राम को lib निर्देशिका से बातें तेजी लाने सकता है चलाना।

आप अस्थायी बिल्ड आइटम को रैम ड्राइव पर भी रख सकते हैं। बेशक आपको बड़ी मात्रा में राम की जरूरत है। एक 2 जीबी रैम ड्राइव शामिल और पुस्तकालयों के लिए पर्याप्त होगा। लेकिन अस्थायी फ़ाइलों (* .obj, आदि) के लिए यह परियोजना पर निर्भर करेगा। तो यह 1 और 4   जीबी अतिरिक्त या अधिक के बीच हो सकता है।

+0

आप * वास्तव में * एक रैम ड्राइव कैसे स्थापित करते हैं? –

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