2009-06-15 15 views
24

में समांतर में कार्यों को कैसे चलाएं जब तक कि मैंने एमएसबिल्ड को पूरी तरह से गलत समझा नहीं है, दस्तावेज़ दस्तावेज़ में कार्य निष्पादित किए जाते हैं जिसमें वे 'लक्ष्य' नोड के भीतर दिखाई देते हैं।MSBuild

मैं यह निर्दिष्ट करने में सक्षम होना चाहता हूं कि दो कार्य (जैसे xcopy कार्य) समानांतर में चल सकते हैं। मैं वहां 'समांतर' कार्य या कुछ होने की उम्मीद कर रहा था ...?

+0

इसके लिए वोट: https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/9604311-allow-custom मैं इसे अपने ही सवाल का से नकल -बिल्ड-टूल्स-टू-रन-इन-समांतर – Trass3r

उत्तर

15

जैसा कि कहा गया था, आप कार्य स्तर पर या लक्ष्य स्तर पर भी समानांतर नहीं हो सकते हैं। एमएसबिल्ड केवल परियोजनाओं को समानांतर में (यानी एमएसबिल्ड परियोजना फाइल) का निर्माण करेगा। तो आपको निर्दिष्ट कई परियोजनाओं के साथ MSBuild task का उपयोग करना होगा और BuildInParallel विशेषता सत्य पर सेट की जानी चाहिए। यह भी सुनिश्चित करें कि जब कमांड लाइन पर निर्माण लागू किया जाता है जिसे/m स्विच भेजा जाता है।

सैयद इब्राहिम हाशिमी

मेरे पुस्तक: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

मुझे लगता है कि विजुअल स्टूडियो (एमएसबिल्ड) पहले से ही एक परियोजना के अंदर समानांतर में फ़ाइलों को संकलित करता है। –

+1

@ बाईयानहुआंग: मुझे लगता है कि सीएल कार्य समानांतर में कई फाइलों को संकलित करने में सक्षम है लेकिन एमएसबिल्ड में कुछ भी नहीं है जो आपको उस कार्यक्षमता का उपयोग करने की अनुमति देता है। – Joey

3

मुझे नहीं लगता कि कुछ बाहरी उपकरण का उपयोग करने के अलावा ऐसा करने का कोई तरीका है। मुझे संदेह है क्योंकि यह संभावित निर्भरता समस्याओं को प्रस्तुत करता है जो एमएस उस समय के लिए अनदेखा करना चुनता है, जिससे बाह्य उपकरण विक्रेताओं को समस्या से निपटने की अनुमति मिलती है (और इसके लिए काफी पैसे लेते हैं)।

5

एमएसबिल्ड के पास /m कमांड लाइन स्विच है जो इसे बनाने के लिए समवर्ती प्रक्रियाओं की अधिकतम संख्या बताता है। डिफ़ॉल्ट मान 1. /m:x एक्स प्रक्रियाओं का उपयोग करेगा। /m कंप्यूटर पर प्रोसेसर की संख्या का उपयोग करेगा।

मैंने विजुअल स्टूडियो में एक शॉर्टकट के हिस्से के रूप में इसका उपयोग समानांतर में परियोजनाओं को संकलित करके त्वरित रूप से चलाने के लिए किया है। स्कॉट हैंनसेलमैन के पास इसके बारे में कुछ पोस्ट हैं here और here

+0

धन्यवाद, लेकिन मुझे कार्य स्तर पर स्पष्ट समांतरता शुरू करने में रूचि है; यह केवल गैर-निर्भर एमएसबिल्ड परियोजनाओं के लिए काम करता है जहां तक ​​मैं देख सकता हूं। मैं शायद देखूंगा कि क्या मैं कार्यों को अलग-अलग परियोजनाओं में बदल सकता हूं। –

3

यहाँ एक तरह से समानांतर में MSBuild लक्ष्यों को चलाने के लिए का एक उदाहरण है। विचार एक ही है ... इस एमएसबिल्ड फ़ाइल को खुद को बनाने के लिए एक परियोजना के रूप में प्रस्तुत करना। Evaluate item defined in msbuild task via C#

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTargets="Build"> 
<Target Name="Build" DependsOnTargets="PrepareEnvironmentForBuild;MapDrives"> 
    <Exec Command="$(MSBuildBinPath)\msbuild /nologo /clp:Verbosity=quiet $(MSBuildThisFileFullPath) /t:TargetWithConfidentialSteps"/> 
    <ItemGroup> 
     <StepsToRunInParallel Include="$(MSBuildThisFileFullPath)"> 
      <Properties>TargetToInvoke=ParallelTarget1</Properties> 
     </StepsToRunInParallel> 
     <StepsToRunInParallel Include="$(MSBuildThisFileFullPath)"> 
      <Properties>TargetToInvoke=ParallelTarget2</Properties> 
     </StepsToRunInParallel> 
    </ItemGroup> 
    <MSBuild Projects="@(StepsToRunInParallel)" BuildInParallel="true" StopOnFirstFailure="true" Targets="InvokeInParallelWithinThisProject"/> 

</Target> 
<Target Name="InvokeInParallelWithinThisProject"> 
    <MSBuild Projects="$(MSBuildThisFileFullPath)" Targets="$(TargetToInvoke)" StopOnFirstFailure="true"/> 
</Target> 
<Target Name="ParallelTarget1"> 
    <Message Text="Hello from ParallelTarget1"/> 
</Target> 
<Target Name="ParallelTarget2"> 
    <Message Text="Hello from ParallelTarget2"/> 
</Target> 
<Target Name="PrepareEnvironmentForBuild"> 
    <Message Text="Hello from PrepareEnvironmentForBuild"/> 
</Target> 
<Target Name="MapDrives"> 
    <Message Text="Hello from MapDrives"/> 
</Target> 
<Target Name="TargetWithConfidentialSteps"> 
    <Message Text="Hush! Verbosity on the wrapper does not affect the Exec call." Importance="High"/> 
</Target>