2010-11-24 10 views
3

Angenommen, ich habe zwei Ziele, die zeitaufwendig sind und ich möchte sie parallel ausführen. Nehmen wir an, ein Ziel führt Unit-Tests durch und das andere generiert einige Dokumentationen. Ich habe versucht, diesen Ansatz:Parallelität in MSBuild

root.targets:

<?xml version="1.0" encoding="utf-8"?> 

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Default"> 
    <Target Name="Default"> 
     <MSBuild Projects="$(MSBuildProjectFile)" Targets="RunTests;BuildDocumentation" BuildInParallel="True"/> 
    </Target> 

    <Target Name="RunTests"> 
     <Message Text="Running tests"/> 
    </Target> 

    <Target Name="BuildDocumentation"> 
     <Message Text="Building documentation"/> 
    </Target> 
</Project> 

Und dann so Aufruf (auf einer Dual-Core-Maschine):

msbuild root.targets /m 

Aber ich bekomme diese Ausgabe:

1>Project "C:\Repository\depot\EDG\DEW\branches\dna.dev.br\DnA\client\src\root.targets" on node 1 (default targets). 
1>Project "C:\Repository\depot\EDG\DEW\branches\dna.dev.br\DnA\client\src\root.targets" (1) is building "C:\Repository\depot\EDG\DEW\branches\dna.dev.br\DnA\client\src\root.targets" (1:2) on node 1 (RunTests;BuildDocumentation target(s)). 
1>RunTests: 
    Running tests 
    BuildDocumentation: 
    Building documentation 

Von diesem und etwas googeln lernte ich diese Parallelisierung tritt nur auf Projektebene auf. So habe ich versucht, dies:

root.targets:

<?xml version="1.0" encoding="utf-8"?> 

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Default"> 
    <Target Name="Default"> 
     <MSBuild Projects="test.targets;documentation.targets" BuildInParallel="True"/> 
    </Target> 
</Project> 

test.targets:

<?xml version="1.0" encoding="utf-8"?> 

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="Default" DependsOnTargets="RunTests"/> 

    <Target Name="RunTests"> 
     <Message Text="Running tests"/> 
    </Target> 
</Project> 

documentation.targets:

<?xml version="1.0" encoding="utf-8"?> 

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="Default" DependsOnTargets="BuildDocumentation"/> 

    <Target Name="BuildDocumentation"> 
     <Message Text="Building documentation"/> 
    </Target> 
</Project> 

Wenn ich es auf die gleiche Weise laufe, bekomme ich:

1>Project "C:\Repository\depot\EDG\DEW\branches\dna.dev.br\DnA\client\src\root.targets" (1) is building "C:\Repository\depot\EDG\DEW\branches\dna.dev.br\DnA\client\src\test.t 
    argets" (2) on node 1 (default targets). 
2>RunTests: 
    Running tests 
2>Done Building Project "C:\Repository\depot\EDG\DEW\branches\dna.dev.br\DnA\client\src\test.targets" (default targets). 
1>Project "C:\Repository\depot\EDG\DEW\branches\dna.dev.br\DnA\client\src\root.targets" (1) is building "C:\Repository\depot\EDG\DEW\branches\dna.dev.br\DnA\client\src\docume 
    ntation.targets" (3) on node 2 (default targets). 
3>BuildDocumentation: 
    Building documentation 

So werden die Ziele parallel aufgebaut.

Aber nur für die Zwecke der Parallelisierung Ziele in separate Dateien zu trennen scheint klobig. Fehle ich hier etwas? Gibt es eine Möglichkeit, die zusätzlichen Zieldateien zu vermeiden und dennoch Parallelität zu erreichen?

Antwort

0

Ich habe das gleiche für meine zeitaufwendigen Builds und das Trennen von Zielen in verschiedenen Dateien gemacht, sieht nicht tollpatschig für mich aus.

Da Sie sie parallel erstellen möchten, interagieren sie nicht. Sie sind Teil des Builds, aber abgesehen davon haben sie keinen Grund, in der gleichen Datei zu sein.

Ich separate auch Eigenschaft und Elemente in einer properties.xml.Targets, um sie leichter zu pflegen. Auf diese Weise kann ich sie in meinen Mehrfachzieldateien referenzieren, ohne Code zu kopieren.

+0

Ja, ich habe auch eine gemeinsame Eigenschaftendatei. Die Tatsache, dass ich Ziele nur für Zwecke der Parallelisierung in neue Dateien zerlegen musste, schreit klobig an, weil ich sie sonst nicht getrennt hätte. Es gibt keinen technischen Grund, warum MSBuild die Ausführung der Ziele nicht parallelisieren konnte, selbst wenn sie sich in derselben Datei befinden. Es würde nur dazu führen, dass separate Prozesse ein anderes Ziel in derselben Datei ausführen, als separate Prozesse, die unterschiedliche Ziele in verschiedenen Dateien ausführen. – cantloginfromwork