2009-06-15 14 views
24

O ile nie rażąco źle zrozumiałem MSBuild, zadania są wykonywane w kolejności dokumentów, w jakiej występują w węźle "Target".Jak uruchamiać zadania równolegle w MSBuild

Chciałbym móc określić, że dwa zadania (takie jak zadania xcopy) mogą działać równolegle. Spodziewałem się, że będzie to zadanie "równoległe" czy coś takiego ...?

+0

zagłosuj na niego: https://visualstudio.uservoice.com/forums/121579-visual-studio-ide/suggestions/9604311-allow-custom -build-tools-to-run-in-parallel – Trass3r

Odpowiedz

15

Jak stwierdzono, nie można dokonywać paraleli na poziomie zadania, a nawet na poziomie docelowym. MSBuild będzie budował tylko projekty (tj. Pliki projektu MSBuild) równolegle. Więc musisz użyć MSBuild task z wieloma projektami, a atrybut BuildInParallel powinien mieć wartość true. Upewnij się również, że po wywołaniu kompilacji w wierszu poleceń zostanie wysłany przełącznik/m.

Sayed Ibrahim Hashimi

My Book: Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

+0

Myślę, że studio graficzne (msbuild) już kompiluje pliki równolegle, nawet w jednym projekcie. –

+1

@BaiyanHuang: Myślę, że to zadanie CL może być w stanie skompilować kilka plików równolegle, ale nie ma nic w MSBuild, który pozwala na korzystanie z tej funkcji. – Joey

3

Nie sądzę, że istnieje sposób, aby to zrobić, inne niż za pomocą zewnętrznego narzędzia. Podejrzewam, że tak jest, ponieważ wprowadza to potencjalne problemy z zależnościami, które MS na razie zignoruje, pozwalając zewnętrznym dostawcom narzędzi na rozwiązanie problemu (i na to sporo pieniędzy).

5

MSBuild ma przełącznik linii komend o wartości /m, który informuje o maksymalnej liczbie współbieżnych procesów, z których można zbudować. Domyślna wartość to 1. /m:x użyje x procesów. /m użyje liczby procesorów na komputerze.

Użyłem tego jako części skrótu w Visual Studio, aby szybciej uruchamiać kompilacje poprzez równoległe kompilowanie projektów. Scott Hanselman ma kilka postów na ten temat: here i here.

+0

Dzięki, ale jestem zainteresowany wprowadzeniem wyraźnego paralelizmu na poziomie Zadania; działa to tylko dla niezależnych projektów MSBuild, o ile widzę. Może zobaczę, czy mogę przekształcić zadania w osobne projekty. –

3

Oto przykład sposób, aby uruchomić msbuild cele równolegle. Pomysł jest taki sam ... przedstawienie samego pliku msbuild jako projektu do zbudowania. Skopiowałem go z moim pytaniem: 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> 

Powiązane problemy