विजुअल स्टूडियो में पुनर्निर्माण और क्लीन + बिल्ड के बीच अंतर


299

विजुअल स्टूडियो 2008 में केवल एक पुनर्निर्माण और क्लीन + बिल्ड बनाने में क्या अंतर है ? क्या Clean + Build अलग है तो Clean + Rebuild कर रहे हैं ?


जवाबों:


308

पुनर्निर्माण = स्वच्छ + बिल्ड (आमतौर पर)

उल्लेखनीय विवरण:

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

  2. सभी तीन क्रियाएं MSBuild लक्ष्यों के अनुरूप हैं। तो एक परियोजना पुनर्निर्माण कार्रवाई को पूरी तरह से कुछ अलग करने के लिए ओवरराइड कर सकती है।


2
तो तुम कह रहे हैं कि पुनर्निर्माण है वास्तव में एक ही रूप में एक स्वच्छ एक के बाद बिल्ड ? जैसा मैंने सोचा था, वैसा ही है, लेकिन मुझे यकीन नहीं था।
जिम मैककेथ

43
साफ-सुथरे पुनर्निर्माण को छोड़कर और प्रत्येक परियोजना को एक-एक करके पुनर्निर्मित करता है। स्वच्छ + बिल्ड सभी को साफ करता है और फिर उन सभी का निर्माण करता है। यदि आप इसे दुर्घटना से क्लिक करते हैं तो ज्यादातर फर्क पड़ता है :)
यूजीन

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

14
यह सच नहीं है। मेरे पास एक परियोजना है जहां क्लीन + बिल्ड सफल रहा, और पुनर्निर्माण ने संकलित त्रुटियों (परिपत्र फ़ाइल संदर्भ) को लौटा दिया। इसलिए वे 100% समान नहीं हैं।
याकोव एलिस

2
हो सकता है कि इस पोस्ट के बाद से चीजें बदल गई है, लेकिन वहाँ एक स्पष्टीकरण क्यों पुनर्निर्माण किया जाता है (नहीं रह गया है?) स्वच्छ + निर्माण के रूप में ही है न stackoverflow.com/questions/3095901/...
डेव

163

अर्ल सही है कि 99% समय पुनर्निर्माण = क्लीन + बिल्ड।

लेकिन वे समान होने की गारंटी नहीं हैं। 3 क्रियाएं (पुनर्निर्माण, निर्माण, स्वच्छ) विभिन्न MSBuild लक्ष्यों का प्रतिनिधित्व करती हैं। जिनमें से प्रत्येक को कस्टम क्रिया करने के लिए किसी भी प्रोजेक्ट फ़ाइल द्वारा ओवरराइड किया जा सकता है। तो किसी के लिए यह पूरी तरह से संभव है कि वह स्वच्छ + बिल्ड (या उन्हें पूरी तरह से हटाने के लिए) शुरू करने से पहले कई कार्यों को करने के लिए पुनर्निर्माण करे।

एक बहुत कोने का मामला है लेकिन टिप्पणी चर्चाओं के कारण इसे इंगित करता है।


यदि आप ऐसी बिल्ड एक्शन जोड़ते हैं, जो .dll फ़ाइलों को एक नए स्थान पर ले जाती है, तो आप केवल एक पुनर्निर्माण करके 'खराब' बिल्ड परिणाम प्राप्त कर सकते हैं। यदि आप एक vb.net और c # प्रोजेक्ट चीजों को मिलाते हैं, तो इससे भी बदतर, टूटे हुए फॉर्म डिजाइनर और कोई काम करने वाला गोटो नहीं मिलता है।
CodingBarfield

+1 भी ध्यान रखें कि पुनर्निर्माण व्यवहार निर्भरता के संबंध में सभी भाषाओं में अनुरूप होना प्रतीत नहीं होता है: stackoverflow.com/questions/12163080/...
lesscode

1
99% समय काफी हद तक कम आंका गया है।
Rhyous

57

आइए डिफॉल्ट स्वच्छ और बिल्ड कार्यान्वयन के संदर्भ में डिफ़ॉल्ट पुनर्निर्माण कार्यान्वयन को परिभाषित करें:

  1. प्रति परियोजना: परियोजना का पुनर्निर्माण = स्वच्छ परियोजना + निर्माण परियोजना।

  2. प्रति समाधान: sln = foreach project in sln (स्वच्छ परियोजना + बिल्ड प्रोजेक्ट) का पुनर्निर्माण करें।

ध्यान दें कि निष्पादन के क्रम में अंतर के कारण, पुनर्निर्माण स्लाइन को (क्लीन स्लन + बिल्ड स्लन) के समान नहीं है। इसके अलावा, यह "फॉरचेक" समवर्ती रूप से निष्पादित हो सकता है, इसलिए दो परिदृश्यों में अलग-अलग कार्यों को समवर्ती चलाने की अनुमति है।

मान लें कि आपके पास एक sln है जिसमें proj1, proj2 और proj3 शामिल हैं।

  • Sln = (स्वच्छ proj1 + बिल्ड proj1) और (स्वच्छ proj2 + बिल्ड proj2) और (स्वच्छ proj3 + बिल्ड proj3) का पुनर्निर्माण करें

  • क्लीन स्लन + बिल्ड स्लन = (क्लीन प्रोज 1 और क्लीन प्रेज 2 एंड क्लीन प्रोज 3) + (बिल्ड प्रोज 1 और बिल्ड प्रोज 2 और बिल्ड प्रोज 3)

+ का मतलब है सीरियल, और मतलब है समवर्ती।

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


7
यह एक सबसे सटीक उत्तर है, क्योंकि यह बताता है कि कभी-कभी मैं पुनर्निर्माण क्यों नहीं कर सकता, लेकिन स्वच्छ + निर्माण करने में सक्षम था।
तोन गुयेन

11

से http://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm , (बस इसे googled):

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

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

संकलन केवल वर्तमान में संपादित की जा रही स्रोत फ़ाइल को संकलित करता है। त्रुटियों के लिए जल्दी से जाँच करने के लिए उपयोगी जब आपकी शेष फाइलें अपूर्ण स्थिति में होती हैं जो संपूर्ण परियोजना के सफल निर्माण को रोकती हैं। Ctrl-F7 कंपाइल के लिए शॉर्टकट की है।


Toan Nguyen की तरह, मैंने अनुभव किया है कि कभी-कभी क्लीन + बिल्ड सॉल्यूशन सफल होता है जहाँ एक पुनर्निर्माण समाधान विफल रहता है (शायद अंतर-प्रोजेक्ट निर्भरता के कारण), इसलिए यह उत्तर भ्रामक है, कम से कम 2018 में।
जॉन कॉम्ब्स

4

से इस ब्लॉग पोस्ट जो लेखक के रूप में जुड़े हुए इस प्रश्न पर एक टिप्पणी :

दरअसल नहीं!!! वे समान नहीं हैं।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.