Folgendes gilt für RAD Studio XE4 verfügbar, aber es kann auch zu früheren oder späteren 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 wusste ich nicht, wie ich damit umgehen sollte.
Wenn Sie ein bauen.grouppproj-Datei mit MSBuild unter Verwendung der Build
, Clean
oder Make
Ziel, der Build nicht parallel ausgeführt, da diese Ziele die CallTarget
Task verwenden, um andere Ziele auszuführen, aber CallTarget
führt seine Ziele nicht parallel ausgeführt.
Um separate Projekte parallel zu erstellen, muss das MSBuild-Projekt eine einzige MSBuild
task verwenden, um mehrere Projekte gleichzeitig zu erstellen. Die Ziele müssen wie folgt definiert werden:
<Target Name="Build">
<MSBuild Projects="@(Projects)" BuildInParallel="true"/>
</Target>
<Target Name="Clean">
<MSBuild Targets="Clean" Projects="@(Projects)" BuildInParallel="true"/>
</Target>
<Target Name="Make">
<MSBuild Targets="Make" Projects="@(Projects)" BuildInParallel="true"/>
</Target>
diese In der .groupproj, entfernen Sie dann die anderen <Target>
Richtlinien sowie die <Import>
Richtlinie. (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 .groupproj definierten Ziele Build
, Clean
und Make
) ermöglicht es Ihnen, alle Projekte zu erstellen, nicht nur eine Teilmenge.
BuildInParallel
was added in MSBuild 3.5. Da jedoch .groupproj Dateien nicht angeben, das ToolsVersion
Attribut wird MSBuild die MSBuild
Aufgabe verwenden, wie in der Version 2.0 definiert, die nicht BuildInParallel
unterstützt haben. Es gibt zwei Möglichkeiten, dieses Problem zu beheben:
- hinzufügen
ToolsVersion="3.5"
(oder eine neuere Version) an die Wurzel <Project>
Element Ihrer .groupproj Datei.
- Run MSBuild mit dem
/toolsversion:3.5
(oder /tv:3.5
kurz) Befehlszeilenparameter (/toolsversion
überschreibt die ToolsVersion
in allen Projektdateien angegeben.)
Nach Dadurch laufen MSBuild mit der /maxcpucount
(oder /m
) und Ihre Projekte sollten parallel aufgebaut werden. Da RAD Studio die Projektgruppe jedoch nicht korrekt behandelt, sollten Sie der Datei eine andere Erweiterung geben, um zu verdeutlichen, dass es sich nicht um eine Standard-RAD Studio-Projektgruppe handelt (jede Erweiterung, die auf proj
endet, tut dies).
Das folgende Stylesheet führt die Transformation oben beschrieben:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
exclude-result-prefixes="msbuild"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
xmlns:msbuild="http://schemas.microsoft.com/developer/msbuild/2003"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="//msbuild:Project">
<xsl:copy>
<xsl:attribute name="ToolsVersion">3.5</xsl:attribute>
<xsl:apply-templates select="@* | node()"/>
<Target Name="Build">
<MSBuild Projects="@(Projects)" BuildInParallel="true"/>
</Target>
<Target Name="Clean">
<MSBuild Targets="Clean" Projects="@(Projects)" BuildInParallel="true"/>
</Target>
<Target Name="Make">
<MSBuild Targets="Make" Projects="@(Projects)" BuildInParallel="true"/>
</Target>
</xsl:copy>
</xsl:template>
<xsl:template match="//msbuild:Target">
<!-- Do not copy -->
</xsl:template>
<xsl:template match="//msbuild:Import">
<!-- Do not copy -->
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Sie dieses Stylesheet mit MSBuild anwenden kann (4.0 oder höher: XslTransformation
wurde in MSBuild 4.0 hinzugefügt) mit dieser Projektdatei (wo groupproj2parallel.xslt
die XSLT Datei oben):
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Build" Inputs="$(InputPaths)" Outputs="$(OutputPaths)">
<XslTransformation
XmlInputPaths="$(InputPaths)"
XslInputPath="groupproj2parallel.xslt"
OutputPaths="$(OutputPaths)" />
</Target>
</Project>
Sie müssen InputPaths
und OutputPaths
explizit auf der Kommandozeile angeben mit /p:InputPaths="..." /p:OutputPaths="..."
, oder indem sie auf derAngabeParameter einer MSBuild
Aufgabe. (Alternativ können Sie auch nur die Dateinamen in der Projektdatei codieren.)
Die Zieldefinitionen mit MSBuild vorgesehen für C# und Visual Basic-Projekte behandeln Abhängigkeiten mithilfe der <ProjectReference>
Elemente in Projektdateien definiert, anstatt zu definieren Abhängigkeiten in der Lösungsdatei. 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.
Vergessen zu erwähnen, ich benutze Embarcadero Delphi XE6 – tabasko
Ich habe das immer selbst gemacht, wenn ich durch das Erstellen der Build mit z. B. Python –
Scripting brauchte Das wäre eine Umgehung ja, aber ich würde es lieber nicht Tun Sie dies, wenn es einen "eingebauten" Mechanismus zu msbuild gibt, um es zu erreichen. – tabasko