Ich habe ein Skript, das alle Projekte (etwa 50) meiner Lösung wie folgt kompiliert
%Vor%Das funktioniert gut, aber es dauert ewig, um es zu kompilieren. Um es schneller zu bauen, habe ich versucht, das Potenzial unserer modernen Multi-Core-Maschinen mit dem hier beschriebenen Schalter "/ maxcpucount" zu nutzen: Ссылка
Ich bekomme ungefähr die gleiche Kompilierungszeit auf meiner 4-Core-CPU-Dev-Maschine. Keine Perf Gewinne.
Scheinbar funktioniert das nur, wenn Projekte Abhängigkeiten aufbauen müssen. Die anderen "Arbeiter" würden diese Abhängigkeiten dann parallel als Hauptprojekt aufbauen. Also habe ich versucht, eine Projektgruppe in Delphi zu erstellen und alle meine Projekte hinzuzufügen und dann den msbuild-Befehl für diese .groupproj auszuführen, aber es ist immer noch so langsam wie es immer war.
Hat jemand von euch mit msbuild mehrere Projekte gleichzeitig erstellt? Wenn ja, kannst du mir eine Erklärung geben?
Danke!
Das Folgende gilt für RAD Studio XE4, kann jedoch auch für frühere oder spätere Versionen gelten. Außerdem werden die in .groupproj definierten Abhängigkeiten nicht mit dieser Methode berücksichtigt. Die .groupproj, die ich parallelisieren wollte, hatte keine Abhängigkeiten zwischen den Projekten, also habe ich nicht herausgefunden, wie ich damit umgehen sollte.
Wenn Sie eine .groupproj-Datei mit MSBuild mit dem Ziel Build
, Clean
oder Make
erstellen, wird der Build nicht parallel ausgeführt, da diese Ziele die Task CallTarget
verwenden, um andere Ziele auszuführen CallTarget
führt seine Ziele nicht parallel aus.
Um separate Projekte parallel zu erstellen, muss das MSBuild-Projekt eine einzelne MSBuild
Aufgabe
Fügen Sie diese zu .groupproj hinzu und entfernen Sie dann die anderen <Target>
-Direktiven sowie die <Import>
-Direktive. ( CodeGear.Group.Targets
definiert einige Ziele, um die Projekte in der richtigen Reihenfolge zu erstellen und Abhängigkeiten zu erstellen, wenn Sie nur eine Teilmenge der Projekte erstellen möchten, aber überschreibt die in der Tabelle definierten Ziele Build
, Clean
und Make
.groupproj.) Beachten Sie, dass Sie damit nur alle Projekte erstellen können, nicht nur eine Teilmenge.
BuildInParallel
wurde in MSBuild 3.5 hinzugefügt. Da .groupproj-Dateien jedoch nicht das Attribut ToolsVersion
angeben, verwendet MSBuild die in Version 2.0 definierte Aufgabe MSBuild
, die BuildInParallel
nicht unterstützt. Es gibt zwei Möglichkeiten, dies zu beheben:
ToolsVersion="3.5"
(oder eine spätere Version) dem Element root <Project>
Ihrer .groupproj-Datei hinzu. /toolsversion:3.5
(oder /tv:3.5
kurz) aus ( /toolsversion
überschreibt das in allen Projektdateien angegebene ToolsVersion
.) Führen Sie danach MSBuild mit dem Argument /maxcpucount
(oder /m
) aus, und Ihre Projekte sollten parallel erstellt werden. RAD Studio behandelt diese transformierte Projektgruppe jedoch nicht korrekt. Daher empfiehlt es sich, der Datei eine andere Erweiterung zuzuweisen, um zu verdeutlichen, dass es sich nicht um eine Standard-RAD Studio-Projektgruppe handelt (jede Erweiterung, die in proj
endet). .
Das folgende XSLT Stylesheet führt die oben beschriebene Transformation durch:
%Vor% Sie können dieses Stylesheet mit MSBuild (4.0 oder höher) anwenden: XslTransformation
wurde hinzugefügt in MSBuild 4.0) mit dieser Projektdatei (wobei groupproj2parallel.xslt
für die obige XSLT-Datei steht):
Sie müssen InputPaths
und OutputPaths
explizit in der Befehlszeile mit /p:InputPaths="..." /p:OutputPaths="..."
angeben oder indem Sie sie im Parameter Properties
eines MSBuild
Aufgabe. (Alternativ können Sie nur die Dateinamen in der Projektdatei fest codieren.)
Die mit MSBuild für C # - und Visual Basic-Projekte bereitgestellten Zieldefinitionen verarbeiten Abhängigkeiten mithilfe der in Projektdateien definierten <ProjectReference>
-Elemente, anstatt Abhängigkeiten in der Lösungsdatei zu definieren. Delphi-.dproj-Dateien und C ++ Builder-.cbproj-Dateien unterstützen dies nicht, da das zugrunde liegende CodeGear.Common.Targets
die in Microsoft.Common.Targets
für <ProjectReference>
definierte Maschine nicht wiederverwenden kann.
Es gibt zwei Möglichkeiten, ein Delphi-Projekt zu erstellen: MSBuild
oder DCC32.exe
. MSBuild
wird empfohlen, da die Projektdateien ( dproj
und groupproj
) alle Konfigurationseinstellungen einschließen.
Allerdings gibt es extra Overhead mit MSBuild
im Vergleich zu plain old DCC32.exe
. Darüber hinaus bringt die Verwendung von MSBuild
zum Erstellen einer Delphi-Projektgruppe ( .groupproj
) keine Vorteile für Multicore-CPUs. Die Build-Leistung entspricht der Single-Core-CPU.
Hier sind meine Statistiken um eine 290 dproj
Datei in einem einzigen groupproj
zu erstellen:
Aus der Lektüre können wir schließen, dass MSBuild
zusätzlichen Overhead im Vergleich zu DCC32
einführt. Um die verfügbaren CPU-Kerne und -Threads voll auszunutzen, ist DCC32
der beste Weg, um den praktischen Entwurf der Verkapselung der Projektkonfiguration für .DPROJ
zu opfern.
Ein msbuild
Skript zum parallelen Erstellen von Delphi groupproj
ist verfügbar unter Ссылка
Tags und Links delphi msbuild delphi-xe6