Delen via


MSBuild transformaties

Een transformatie is een een-op-een-conversie van de ene itemlijst naar een andere. Met transformaties kunnen projecten in Visual Studio itemlijsten converteren. Met transformaties kunnen doelen ook een directe mapping tussen hun invoer en uitvoer herkennen.

In dit artikel wordt uitgelegd wat transforms zijn en hoe de Microsoft Build Engine (MSBuild) deze gebruikt om projecten efficiënter te bouwen.

Transformatieaanpassingen

Transformaties worden niet willekeurig gedefinieerd. Elke transformatie wordt geïdentificeerd als een wijziging van de indeling %(\<ItemMetaDataName>). Metagegevens van items kunnen worden gebruikt als transformatieaanpassing, inclusief de bekende metagegevens van items die aan elk item zijn toegewezen bij het maken. Zie MSBuild-bekende itemmetadata voor de bekende itemmetadata-lijst.

In het volgende voorbeeld wordt een lijst met .resx-bestanden omgezet in een lijst met .resources-bestanden . De %(filename) transformatieaanpassing geeft aan dat elk .resources-bestand dezelfde bestandsnaam heeft als het bijbehorende RESX-bestand :

@(RESXFile->'%(filename).resources')

Als de items in de @(RESXFile) itemlijst Form1.resx, Form2.resx en Form3.resx zijn, bevat de getransformeerde lijst de uitvoer Form1.resources, Form2.resources en Form3.resources.

Opmerking

Het standaardscheidingsteken voor items in een getransformeerde lijst is de puntkomma ;. U kunt op dezelfde manier een aangepast scheidingsteken opgeven als u een scheidingsteken voor een standaarditemlijst opgeeft. Als u items wilt scheiden met een komma , , gebruikt u de syntaxis @(RESXFile->'Toolset\%(filename)%(extension)', ',').

Meerdere transformatiemodifiers

Een transformatie-expressie kan meerdere modifiers bevatten die in elke volgorde kunnen worden gecombineerd en kunnen worden herhaald. In het volgende voorbeeld wordt de naam van de map met de bestanden gewijzigd, maar de bestanden behouden de oorspronkelijke naam en bestandsnaamextensie:

@(RESXFile->'Toolset\%(filename)%(extension)')

Als de items in de RESXFile lijst met items Project1\Form1.resx, Project1\Form2.resx en Project1\Form3.text zijn, bevat de getransformeerde lijst de uitvoer Toolset\Form1.resx, Toolset\Form2.resx en Toolset\Form3.text.

Doeltoewijzing en afhankelijkheidsanalyse

Transformaties garanderen een een-op-een mapping tussen de getransformeerde itemlijst en de oorspronkelijke itemlijst. Als een doel uitvoer maakt die transformaties van de invoer zijn, kan MSBuild de tijdstempels van de invoer en uitvoer analyseren. MSBuild gebruikt de informatie om te bepalen of een doel moet worden overgeslagen, gebouwd of gedeeltelijk opnieuw moet worden opgebouwd.

In het volgende voorbeeld worden de invoer voor de kopieertaak omgezet in uitvoer. Elk bestand in de invoeritemlijst BuiltAssemblies wordt toegewezen aan een bestand in de doelmap van de taak die is opgegeven met behulp van een transformatie in het Outputs kenmerk. Als een bestand in de BuiltAssemblies lijst met items wordt gewijzigd, wordt alleen het Copy task gewijzigde bestand uitgevoerd en worden alle andere bestanden overgeslagen.

<Target Name="CopyOutputs"
    Inputs="@(BuiltAssemblies)"
    Outputs="@(BuiltAssemblies -> '$(OutputPath)%(Filename)%(Extension)')">

    <Copy
        SourceFiles="@(BuiltAssemblies)"
        DestinationFolder="$(OutputPath)"/>

</Target>

Zie voor meer informatie over afhankelijkheidsanalyse en het gebruik van transformaties incrementele MSBuild-builds voor nieuwe of verouderde doelen.

Projectbestand met transformaties

In het volgende voorbeeld ziet u een projectbestand voor MSBuild dat gebruikmaakt van transformaties. In het voorbeeld wordt ervan uitgegaan dat de map c:\sub0\sub1\sub2\sub3 slechts één XSD-bestand bevat en dat de werkmap c:\sub0 is.

<Project>
    <ItemGroup>
        <Schema Include="sub1\**\*.xsd"/>
    </ItemGroup>

    <Target Name="Messages">
        <Message Text="rootdir: @(Schema->'%(rootdir)')"/>
        <Message Text="fullpath: @(Schema->'%(fullpath)')"/>
        <Message Text="rootdir + directory + filename + extension: @(Schema->'%(rootdir)%(directory)%(filename)%(extension)')"/>
        <Message Text="identity: @(Schema->'%(identity)')"/>
        <Message Text="filename: @(Schema->'%(filename)')"/>
        <Message Text="directory: @(Schema->'%(directory)')"/>
        <Message Text="relativedir: @(Schema->'%(relativedir)')"/>
        <Message Text="extension: @(Schema->'%(extension)')"/>
    </Target>
</Project>

Het voorbeeld produceert de volgende uitvoer:

rootdir: C:\
fullpath: C:\sub0\sub1\sub2\sub3\myfile.xsd
rootdir + directory + filename + extension: C:\sub0\sub1\sub2\sub3\myfile.xsd
identity: sub1\sub2\sub3\myfile.xsd
filename: myfile
directory: sub0\sub1\sub2\sub3\
relativedir: sub1\sub2\sub3\
extension: .xsd