Delen via


Eigenschappen en items vergelijken

MSBuild-eigenschappen en -items worden beide gebruikt om informatie door te geven aan taken, voorwaarden te evalueren en waarden op te slaan waarnaar in het projectbestand kan worden verwezen.

  • Eigenschappen zijn naam-waardeparen. Zie MSBuild-eigenschappenvoor meer informatie.

  • Items zijn objecten die doorgaans bestanden vertegenwoordigen. Itemobjecten kunnen gekoppelde metagegevensverzamelingen hebben. Metagegevens zijn naam-waardeparen. Zie Itemsvoor meer informatie.

Scalaire waarden en vectoren

Omdat MSBuild-eigenschappen naam-waardeparen zijn die slechts één tekenreekswaarde hebben, worden ze vaak beschreven als scalaire waarde. Omdat MSBuild-itemtypen lijsten met items zijn, worden ze vaak beschreven als vector. In de praktijk kunnen eigenschappen echter meerdere waarden vertegenwoordigen en itemtypen kunnen nul of één item bevatten.

Doelafhankelijkheidsinjectie

Als u wilt zien hoe eigenschappen meerdere waarden kunnen vertegenwoordigen, kunt u een gemeenschappelijk gebruikspatroon overwegen voor het toevoegen van een doel aan een lijst met doelen die moeten worden gebouwd. Deze lijst wordt meestal vertegenwoordigd door een eigenschapswaarde, met de doelnamen gescheiden door puntkomma's.

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

De BuildDependsOn eigenschap wordt meestal gebruikt als het argument van een doelkenmerk DependsOnTargets , waardoor deze effectief wordt geconverteerd naar een itemlijst. Deze eigenschap kan worden overschreven om een doel toe te voegen of om de uitvoeringsvolgorde van het doel te wijzigen. Bijvoorbeeld

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

voegt het CustomBuild-doel toe aan de doellijst, waardoor de waarde BuildDependsOnwordt opgegevenBeforeBuild;CoreBuild;AfterBuild;CustomBuild.

Vanaf MSBuild 4.0 wordt doelafhankelijkheidsinjectie afgeschaft. Gebruik in plaats daarvan de AfterTargets kenmerken en BeforeTargets kenmerken. Zie De buildvolgorde target voor meer informatie.

Conversies tussen tekenreeksen en itemlijsten

MSBuild voert indien nodig conversies van en naar itemtypen en tekenreekswaarden uit. Als u wilt zien hoe een itemlijst een tekenreekswaarde kan worden, kunt u overwegen wat er gebeurt wanneer een itemtype wordt gebruikt als de waarde van een MSBuild-eigenschap:

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

Het itemtype OutputDir heeft een Include kenmerk met de waarde 'KeyFiles\; Certificaten\". MSBuild parseert deze tekenreeks in twee items: KeyFiles\ en Certificates\. Wanneer het itemtype OutputDir wordt gebruikt als de waarde van de eigenschap OutputDirList, converteert MSBuild het itemtype naar de door puntkomma's gescheiden tekenreeks 'KeyFiles\; Certificaten\".

Eigenschappen en items in taken

Eigenschappen en items worden gebruikt als invoer en uitvoer voor MSBuild-taken. Zie Tasksvoor meer informatie.

Eigenschappen worden als kenmerken doorgegeven aan taken. Binnen de taak wordt een MSBuild-eigenschap vertegenwoordigd door een eigenschapstype waarvan de waarde kan worden geconverteerd naar en van een tekenreeks. De ondersteunde eigenschapstypen omvatten bool, , char, DateTime, Decimal, Double, , inten stringelk type dat ChangeType kan worden verwerkt.

Items worden als objecten doorgegeven aan taken ITaskItem . Binnen de taak ItemSpec vertegenwoordigt u de waarde van het item en GetMetadata haalt u de metagegevens op.

De itemlijst van een itemtype kan worden doorgegeven als een matrix met ITaskItem objecten. Items kunnen worden verwijderd uit een itemlijst in een doel met behulp van het Remove kenmerk. Omdat items uit een itemlijst kunnen worden verwijderd, is het mogelijk dat een itemtype nul items heeft. Als een itemlijst wordt doorgegeven aan een taak, moet de code in de taak op deze mogelijkheid controleren.

Evaluatievolgorde voor eigenschappen en items

Tijdens de evaluatiefase van een build worden geïmporteerde bestanden opgenomen in de build in de volgorde waarin ze worden weergegeven. Eigenschappen en items worden gedefinieerd in drie doorgangen in de volgende volgorde:

  • Eigenschappen worden gedefinieerd en gewijzigd in de volgorde waarin ze worden weergegeven.

  • Itemdefinities worden gedefinieerd en gewijzigd in de volgorde waarin ze worden weergegeven.

  • Items worden gedefinieerd en gewijzigd in de volgorde waarin ze worden weergegeven.

Tijdens de uitvoeringsfase van een build worden eigenschappen en items die binnen doelen zijn gedefinieerd, samen geëvalueerd in één fase in de volgorde waarin ze worden weergegeven.

Dit is echter niet het volledige verhaal. Wanneer een eigenschap, itemdefinitie of item is gedefinieerd, wordt de waarde ervan geëvalueerd. De expressie-evaluator breidt de tekenreeks uit waarmee de waarde wordt opgegeven. De tekenreeksuitbreiding is afhankelijk van de buildfase. Hier volgt een gedetailleerdere volgorde voor eigenschaps- en artikelevaluatie:

  • Tijdens de evaluatiefase van een build:

    • Eigenschappen worden gedefinieerd en gewijzigd in de volgorde waarin ze worden weergegeven. Eigenschapsfuncties worden uitgevoerd. Eigenschapswaarden in het formulier $(PropertyName) worden uitgevouwen binnen expressies. De eigenschapswaarde is ingesteld op de uitgevouwen expressie.

    • Itemdefinities worden gedefinieerd en gewijzigd in de volgorde waarin ze worden weergegeven. Eigenschapsfuncties zijn al uitgebreid binnen expressies. Metagegevenswaarden worden ingesteld op de uitgebreide expressies.

    • Itemtypen worden gedefinieerd en gewijzigd in de volgorde waarin ze worden weergegeven. Itemwaarden in het formulier @(ItemType) worden uitgevouwen. Itemtransformaties worden ook uitgevouwen. Eigenschapsfuncties en -waarden zijn al uitgebreid binnen expressies. De itemlijst- en metagegevenswaarden worden ingesteld op de uitgevouwen expressies.

  • Tijdens de uitvoeringsfase van een build:

    • Eigenschappen en items die binnen doelen zijn gedefinieerd, worden samen geëvalueerd in de volgorde waarin ze worden weergegeven. Eigenschapsfuncties worden uitgevoerd en eigenschapswaarden worden uitgebreid binnen expressies. Itemwaarden en itemtransformaties worden ook uitgevouwen. De eigenschapswaarden, itemtypewaarden en metagegevenswaarden worden ingesteld op de uitgebreide expressies.

Subtiele effecten van de evaluatievolgorde

In de evaluatiefase van een build gaat de eigenschapsevaluatie vooraf aan de itemevaluatie. Eigenschappen kunnen echter waarden bevatten die afhankelijk lijken te zijn van itemwaarden. Houd rekening met het volgende script.

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

Als u de berichttaak uitvoert, wordt dit bericht weergegeven:

KeyFileVersion: 1.0.0.3

Dit komt doordat de waarde KeyFileVersion van de tekenreeks '@(KeyFile->'%(versie)') is. Item- en itemtransformaties zijn niet uitgevouwen toen de eigenschap voor het eerst werd gedefinieerd, dus de KeyFileVersion eigenschap werd de waarde van de niet-uitgevouwen tekenreeks toegewezen.

Tijdens de uitvoeringsfase van de build, wanneer de taak Bericht wordt verwerkt, vouwt MSBuild de tekenreeks '@(KeyFile->'%(versie)') uit om '1.0.0.3' op te geven.

U ziet dat hetzelfde bericht wordt weergegeven, zelfs als de eigenschaps- en itemgroepen in volgorde zijn omgekeerd.

Als tweede voorbeeld kunt u overwegen wat er kan gebeuren wanneer eigenschaps- en itemgroepen zich binnen doelen bevinden:

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

In de taak Bericht wordt dit bericht weergegeven:

KeyFileVersion:

Dit komt doordat tijdens de uitvoeringsfase van de build-, eigenschaps- en itemgroepen die binnen doelen zijn gedefinieerd, tegelijkertijd boven naar beneden worden geëvalueerd. Wanneer KeyFileVersion dit is gedefinieerd, KeyFile is onbekend. Daarom wordt de itemtransformatie uitgebreid naar een lege tekenreeks.

Als u in dit geval de volgorde van de eigenschaps- en itemgroepen omdraait, wordt het oorspronkelijke bericht hersteld:

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

De waarde is KeyFileVersion ingesteld op '1.0.0.3' en niet op '@(KeyFile->'%(versie)'). In de taak Bericht wordt dit bericht weergegeven:

KeyFileVersion: 1.0.0.3