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?
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