Freigeben über


Vergleichen von Eigenschaften und Elementen

MSBuild-Eigenschaften und -Elemente werden beide verwendet, um Informationen an Vorgänge zu übergeben, Bedingungen auszuwerten und Werte zu speichern, auf die in der gesamten Projektdatei verwiesen werden kann.

  • Eigenschaften sind Name-Wert-Paare. Weitere Informationen finden Sie unter MSBuild-Eigenschaften.

  • Elemente sind Objekte, die in der Regel Dateien darstellen. Elementobjekte können metadatenauflistungen zugeordnet sein. Metadaten sind Name-Wert-Paare. Weitere Informationen finden Sie unter Elemente.

Skalare und Vektoren

Da MSBuild-Eigenschaften Name-Wert-Paare sind, die nur einen Zeichenfolgenwert aufweisen, werden sie häufig als Skalar beschrieben. Da MSBuild-Elementtypen Listen von Elementen sind, werden sie häufig als Vektor beschrieben. In der Praxis können Eigenschaften jedoch mehrere Werte darstellen, und Elementtypen können null oder ein Element aufweisen.

Zielabhängigkeitsinjektion

Um zu sehen, wie Eigenschaften mehrere Werte darstellen können, sollten Sie ein allgemeines Verwendungsmuster zum Hinzufügen eines Ziels zu einer Liste der zu erstellenden Ziele in Betracht ziehen. Diese Liste wird in der Regel durch einen Eigenschaftswert dargestellt, wobei die Zielnamen durch Semikolons getrennt sind.

<PropertyGroup>
    <BuildDependsOn>
        BeforeBuild;
        CoreBuild;
        AfterBuild
    </BuildDependsOn>
</PropertyGroup>

Die BuildDependsOn Eigenschaft wird in der Regel als Argument eines Zielattributes DependsOnTargets verwendet und effektiv in eine Elementliste konvertiert. Diese Eigenschaft kann überschrieben werden, um ein Ziel hinzuzufügen oder die Zielausführungsreihenfolge zu ändern. Beispiel:

<PropertyGroup>
    <BuildDependsOn>
        $(BuildDependsOn);
        CustomBuild;
    </BuildDependsOn>
</PropertyGroup>

fügt das CustomBuild-Ziel der Zielliste hinzu, wobei der Wert angegeben BuildDependsOn wird BeforeBuild;CoreBuild;AfterBuild;CustomBuild.

Ab MSBuild 4.0 ist die Zielabhängigkeitsinjektion veraltet. Verwenden Sie stattdessen die AfterTargets Attribute.BeforeTargets Weitere Informationen finden Sie unter Zielbuildreihenfolge.

Konvertierungen zwischen Zeichenfolgen und Elementlisten

MSBuild führt bei Bedarf Konvertierungen in und aus Elementtypen und Zeichenfolgenwerten durch. Um zu sehen, wie eine Elementliste zu einem Zeichenfolgenwert werden kann, überlegen Sie, was passiert, wenn ein Elementtyp als Wert einer MSBuild-Eigenschaft verwendet wird:

<ItemGroup>
    <OutputDir Include="KeyFiles\;Certificates\" />
</ItemGroup>
<PropertyGroup>
    <OutputDirList>@(OutputDir)</OutputDirList>
</PropertyGroup>

Der Elementtyp OutputDir hat ein Include Attribut mit dem Wert "KeyFiles\; Zertifikate\". MSBuild analysiert diese Zeichenfolge in zwei Elemente: KeyFiles\ und Certificates\. Wenn der Elementtyp OutputDir als Wert der OutputDirList-Eigenschaft verwendet wird, konvertiert MSBuild den Elementtyp in die durch Semikolons getrennte Zeichenfolge "KeyFiles\" oder "flacht" in den Elementtyp. Zertifikate\".

Eigenschaften und Elemente in Aufgaben

Eigenschaften und Elemente werden als Eingaben und Ausgaben für MSBuild-Aufgaben verwendet. Weitere Informationen finden Sie unter Aufgaben.

Eigenschaften werden als Attribute an Vorgänge übergeben. Innerhalb der Aufgabe wird eine MSBuild-Eigenschaft durch einen Eigenschaftstyp dargestellt, dessen Wert in und aus einer Zeichenfolge konvertiert werden kann. Die unterstützten Eigenschaftentypen umfassen bool, , char, , DateTimeDecimal, Double, int, und stringalle Typen, die ChangeType behandelt werden können.

Elemente werden als ITaskItem Objekte an Aufgaben übergeben. Innerhalb der Aufgabe ItemSpec stellt den Wert des Elements dar und GetMetadata ruft dessen Metadaten ab.

Die Elementliste eines Elementtyps kann als Array von ITaskItem Objekten übergeben werden. Elemente können mithilfe des Remove Attributs aus einer Elementliste in einem Ziel entfernt werden. Da Elemente aus einer Elementliste entfernt werden können, ist es möglich, dass ein Elementtyp null Elemente enthält. Wenn eine Elementliste an eine Aufgabe übergeben wird, sollte der Code in der Aufgabe auf diese Möglichkeit überprüft werden.

Reihenfolge der Eigenschaften- und Elementauswertung

Während der Auswertungsphase eines Builds werden importierte Dateien in die Buildreihenfolge integriert, in der sie angezeigt werden. Eigenschaften und Elemente werden in drei Durchläufen in der folgenden Reihenfolge definiert:

  • Eigenschaften werden in der Reihenfolge definiert und geändert, in der sie angezeigt werden.

  • Elementdefinitionen werden in der Reihenfolge definiert und geändert, in der sie angezeigt werden.

  • Elemente werden in der Reihenfolge definiert und geändert, in der sie angezeigt werden.

Während der Ausführungsphase eines Builds werden Eigenschaften und Elemente, die innerhalb von Zielen definiert sind, in einer einzelnen Phase in der Reihenfolge ausgewertet, in der sie angezeigt werden.

Dies ist jedoch nicht die ganze Geschichte. Wenn eine Eigenschaft, Elementdefinition oder ein Element definiert ist, wird der Wert ausgewertet. Der Ausdrucksauswert erweitert die Zeichenfolge, die den Wert angibt. Die Zeichenfolgenerweiterung hängt von der Buildphase ab. Hier ist eine detailliertere Reihenfolge der Eigenschafts- und Elementauswertung:

  • Während der Evaluierungsphase eines Builds:

    • Eigenschaften werden in der Reihenfolge definiert und geändert, in der sie angezeigt werden. Eigenschaftenfunktionen werden ausgeführt. Eigenschaftswerte im Format $(PropertyName) werden innerhalb von Ausdrücken erweitert. Der Eigenschaftswert wird auf den erweiterten Ausdruck festgelegt.

    • Elementdefinitionen werden in der Reihenfolge definiert und geändert, in der sie angezeigt werden. Eigenschaftenfunktionen wurden bereits in Ausdrücken erweitert. Metadatenwerte werden auf die erweiterten Ausdrücke festgelegt.

    • Elementtypen werden in der Reihenfolge definiert und geändert, in der sie angezeigt werden. Elementwerte im Formular @(ItemType) werden erweitert. Elementtransformationen werden ebenfalls erweitert. Eigenschaftenfunktionen und -werte wurden bereits innerhalb von Ausdrücken erweitert. Die Elementliste und Metadatenwerte werden auf die erweiterten Ausdrücke festgelegt.

  • Während der Ausführungsphase eines Builds:

    • Eigenschaften und Elemente, die innerhalb von Zielen definiert sind, werden in der Reihenfolge ausgewertet, in der sie angezeigt werden. Eigenschaftenfunktionen werden ausgeführt, und Eigenschaftswerte werden innerhalb von Ausdrücken erweitert. Elementwerte und Elementtransformationen werden ebenfalls erweitert. Die Eigenschaftswerte, Elementtypwerte und Metadatenwerte werden auf die erweiterten Ausdrücke festgelegt.

Subtile Effekte der Auswertungsreihenfolge

In der Auswertungsphase eines Builds geht der Eigenschaftenauswertung die Elementauswertung voraus. Dennoch können Eigenschaften Werte aufweisen, die scheinbar von Elementwerten abhängen. Betrachten Sie das folgende Skript.

<ItemGroup>
    <KeyFile Include="KeyFile.cs">
        <Version>1.0.0.3</Version>
    </KeyFile>
</ItemGroup>
<PropertyGroup>
    <KeyFileVersion>@(KeyFile->'%(Version)')</KeyFileVersion>
</PropertyGroup>
<Target Name="AfterBuild">
    <Message Text="KeyFileVersion: $(KeyFileVersion)" />
</Target>

Beim Ausführen der Meldungsaufgabe wird diese Meldung angezeigt:

KeyFileVersion: 1.0.0.3

Dies liegt daran, dass der Wert KeyFileVersion tatsächlich die Zeichenfolge "@(KeyFile->'%(Version)')" ist. Element- und Elementtransformationen wurden beim ersten Definieren der Eigenschaft nicht erweitert, sodass die KeyFileVersion Eigenschaft dem Wert der nicht erweiterten Zeichenfolge zugewiesen wurde.

Während der Ausführungsphase des Builds erweitert MSBuild beim Verarbeiten der Message-Aufgabe die Zeichenfolge "@(KeyFile->'%(Version)')" um "1.0.0.3".

Beachten Sie, dass dieselbe Nachricht auch dann angezeigt würde, wenn die Eigenschaften- und Elementgruppen in der Reihenfolge umgekehrt wurden.

Betrachten Sie als zweites Beispiel, was passieren kann, wenn Sich Eigenschafts- und Elementgruppen innerhalb von Zielen befinden:

<Target Name="AfterBuild">
    <PropertyGroup>
        <KeyFileVersion>@(KeyFile->'%(Version)')</KeyFileVersion>
    </PropertyGroup>
    <ItemGroup>
        <KeyFile Include="KeyFile.cs">
            <Version>1.0.0.3</Version>
        </KeyFile>
    </ItemGroup>
    <Message Text="KeyFileVersion: $(KeyFileVersion)" />
</Target>

Die Meldungsaufgabe zeigt diese Meldung an:

KeyFileVersion:

Dies liegt daran, dass während der Ausführungsphase der Build-, Eigenschafts- und Elementgruppen, die innerhalb von Zielen definiert sind, gleichzeitig von oben nach unten ausgewertet werden. Wenn KeyFileVersion sie definiert ist, KeyFile ist unbekannt. Daher wird die Elementtransformation auf eine leere Zeichenfolge erweitert.

In diesem Fall wird durch das Umkehren der Reihenfolge der Eigenschafts- und Elementgruppen die ursprüngliche Nachricht wiederhergestellt:

<Target Name="AfterBuild">
    <ItemGroup>
        <KeyFile Include="KeyFile.cs">
            <Version>1.0.0.3</Version>
        </KeyFile>
    </ItemGroup>
    <PropertyGroup>
        <KeyFileVersion>@(KeyFile->'%(Version)')</KeyFileVersion>
    </PropertyGroup>
    <Message Text="KeyFileVersion: $(KeyFileVersion)" />
</Target>

Der Wert von KeyFileVersion ist auf "1.0.0.3" und nicht auf "@(KeyFile->'%(Version)')" festgelegt. Die Meldungsaufgabe zeigt diese Meldung an:

KeyFileVersion: 1.0.0.3