2010-06-07 10 views
5

एमएस से इस article पर देखकर, मेरे पास SolutionToBuild अनुभाग के बारे में एक प्रश्न है।एमएसबिल्ड बिल्ड अनुक्रम

<ItemGroup> 
    <SolutionToBuild Include="$(SolutionRoot)\path\MySolution.sln /> 
    <SolutionToBuild Include="$(SolutionRoot)\Scribble\scribble.sln" /> 
    <SolutionToBuild Include="$(SolutionRoot)\HelloWorld\HelloWorld.sln" /> 
    <SolutionToBuild Include="$(SolutionRoot)\TestProject1\TestProject1.sln" /> 
</ItemGroup> 

यह कहता है कि निर्माण का अनुक्रम ऊपर दिए गए आदेश द्वारा निर्धारित किया जाता है। तो, उदाहरण के लिए, माईसोल्यूशन स्क्रिबल से पहले बनाया जाएगा।

हालांकि, यह सुरक्षित है यदि स्क्रीबल निर्भर है MySolution पर? उदाहरण के लिए, माईसोल्यूशन एक या अधिक डीएलएल आउटपुट करता है जो स्क्रिबल द्वारा उपयोग किए जाते हैं। यदि माईसोल्यूशन और स्क्रिबल एक साथ बदल दिए जाते हैं, तो क्या निर्माण अगले परियोजना में जाने से पहले पूरी तरह संकलित होने के लिए माईसोल्यूशन के लिए इंतजार करेगा?

उत्तर

5

आप आइटम SolutionToBuild के लिए अतिरिक्त मेटाडेटा का उपयोग करने का प्रयास कर सकते हैं। कुछ रिकर्सन और voilà के साथ काम करते हैं!

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<ItemGroup> 
    <SolutionToBuild Include="$(SolutionRoot)\Scribble\levelone.sln"> 
     <DependsOnSolutions>$(SolutionRoot)\Scribble\leveltwo.sln</DependsOnSolutions> 
    </SolutionToBuild>   
    <SolutionToBuild Include="$(SolutionRoot)\Scribble\leveltwo.sln"> 
     <DependsOnSolutions>$(SolutionRoot)\Scribble\levelthree.sln;$(SolutionRoot)\TestProject1\TestProject1.sln</DependsOnSolutions> 
    </SolutionToBuild> 
    <SolutionToBuild Include="$(SolutionRoot)\Scribble\levelthree.sln" /> 
    <SolutionToBuild Include="$(SolutionRoot)\TestProject1\TestProject1.sln" /> 
</ItemGroup> 

<Target Name="Build"> 
    <MSBuild Projects="$(MSBuildProjectFile)" 
      Targets="BuildSolution"     
      Properties="SolutionFullPath=%(SolutionToBuild.Identity)"/> 
</Target> 

<Target Name="BuildSolution"> 
    <CreateItem Condition="'%(SolutionToBuild.Identity)'=='$(SolutionFullPath)'" 
     Include="%(SolutionToBuild.DependsOnSolutions)"> 
     <Output TaskParameter="Include" 
       ItemName="DependentSolutions" /> 
    </CreateItem> 

    <Message Text="Building solution $(SolutionFullPath)..." />   
    <Message Text="Solution $(SolutionFullPath) depends on %(DependentSolutions.Identity)..." 
      Condition="'@(DependentSolutions)'!=''"/> 
    <Message Text="Building dependent solutions..." 
      Condition="'@(DependentSolutions)'!=''"/> 

    <MSBuild Projects="$(MSBuildProjectFile)" 
      Targets="BuildSolution" 
      Properties="SolutionFullPath=%(DependentSolutions.Identity)" 
      Condition="'@(DependentSolutions)'!=''"/> 

    <!-- <MSBuild Projects="$(SolutionFullPath)" /> --> 
    <Message Text="Building solution $(SolutionFullPath)... OK" /> 
</Target> 
</Project> 
1

आप समाधान निर्भरता का प्रबंधन कैसे करते हैं? क्या आप इसके बजाय परियोजनाओं का संदर्भ नहीं दे रहे हैं? मैं आपके कुछ समाधानों पर 'एक साथ' परिवर्तनों के बारे में भी परेशान हूं। कृपया इन परिवर्तनों की प्रकृति को स्पष्ट करें।

अब तक, अपने प्रश्नों के उत्तर दिए गए हैं:

  1. नहीं। वे एक के बाद एक संकलित किया जा सकता है लेकिन यह निर्भरता के लिए अर्हता प्राप्त करता है?
  2. हां। यदि अनुक्रम अनिवार्य है, तो निर्माता अगले तक जाने से पहले प्रत्येक समाधान (या तो सफलता या त्रुटि के साथ) तक 'प्रतीक्षा करें' होगा।
+0

मैंने अपना प्रश्न अपडेट किया है। क्या आप स्पष्ट कर सकते हैं कि "अनुक्रम अनिवार्य है" से आपका क्या मतलब है? –

+0

मेरा मतलब था, अगर निर्माण समानांतर नहीं है और समाधान कतार क्रम में बनाए गए हैं ... तो निर्माता वास्तव में प्रतीक्षा करेगा। हालांकि, मुझे समझ में नहीं आता कि दोनों समाधानों में एक साथ अद्यतन कैसे हो सकता है, या निर्माण प्रक्रिया पर कौन सा साइड इफेक्ट उत्पन्न होगा - शायद कोई नहीं, क्योंकि वास्तव में महत्वपूर्ण बात यह है कि निर्माण के प्रारंभ समय के सापेक्ष अद्यतन का समय । बीटीडब्ल्यू, क्या आप इस स्थिति का परीक्षण कर सकते हैं? – Humberto

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