11

हम एक से अधिक सॉफ्टवेयर प्रोजेक्ट में single master solution strategy का उपयोग कर रहे हैं, और हाल ही में किसी ने सामान्य कोड में निर्भरता को जोड़ा है जो अन्य प्रोजेक्ट के समाधान को तोड़ देता है जब तक कि नई निर्भरता उनके समाधान में नहीं जोड़ा जाता। इस तरह के मुद्दे को खत्म करने या कम करने के लिए एक अच्छी रणनीति क्या है?निर्भरता जोड़े जाने पर स्वचालित रूप से मास्टर समाधान को कैसे अपडेट करें?

हम निम्नलिखित के बारे में सोचा गया है: एकाधिक विभाजित समाधान के साथ

  • चेकइन लॉग संदेश में कीवर्ड जोड़ें निर्भरता को जोड़ने के लिए अन्य परियोजनाओं को बताने के लिए (लेकिन यह एक मानवीय प्रक्रिया है)
  • कार्य एक मास्टर समाधान के बजाय (जिसके परिणामस्वरूप लंबे समय तक निर्माण, समाधानों में इंटेलिजेंस का नुकसान, आदि)
  • कई विभाजन समाधानों से मास्टर समाधान बनाने के लिए एक उपकरण का उपयोग करें (वीएस2015 के साथ काम करने वाले किसी भी सुझाव, और यह स्वचालित हो सकता है ?)

अब तक हमारा सबसे बड़ा एकल मास्टर समाधान 115 प्रोजेक्ट फाइल है, इसलिए अकेले उस आधार पर यह समाधान की आवश्यकता नहीं है जब तक कि यह हमारी समस्या को हल करने का सबसे अच्छा तरीका न हो।

यदि आप इस समस्या से गुजर चुके हैं, तो आपने इसे कैसे हल किया?

+0

क्या भाषा? सी ++? आप प्रोजेक्ट संदर्भों का उपयोग कर सकते हैं, वे समाधान फ़ाइल के बजाय प्रोजेक्ट फ़ाइल का हिस्सा हैं, इसलिए इसका उपयोग करने वाले प्रत्येक समाधान को स्वचालित रूप से संदर्भ प्राप्त होगा। – stijn

+0

हां, सी ++। हम संदर्भों का उपयोग करते हैं, लेकिन यदि एक संदर्भित परियोजना समाधान में नहीं है, तो क्या विजुअल स्टूडियो को इसे बनाने के लिए कहने का कोई तरीका है? – traal

+1

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

उत्तर

2

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

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="BuildProjectReferences" BeforeTargets="BuildGenerateSources"> 
    <MsBuild Projects="@(ProjectReference)" 
      Properties="Configuration=$(Configuration);Platform=$(Platform)"/> 
    </Target> 
</Project> 

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

... 
    <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <!-- this is near the bottom already --> 
    <Import Project="..\BuildProjectReferences.targets" /> !<-- add this --> 
    ... 
</Project> 

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

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

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

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

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