Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
En transformering är en en-till-en-konvertering av en objektlista till en annan. Transformeringar gör det möjligt för projekt i Visual Studio att konvertera objektlistor. Transformeringar gör det också möjligt för mål att identifiera en direkt mappning mellan indata och utdata.
Den här artikeln beskriver transformeringar och hur Microsoft Build Engine (MSBuild) använder dem för att skapa projekt mer effektivt.
Transformera modifierare
Transformeringar definieras inte godtyckligt. Varje transformering identifieras som en modifierare av formatet %(\<ItemMetaDataName>). Alla objektmetadata kan användas som transformeringsmodifierare, inklusive de välkända objektmetadata som tilldelas varje objekt när de skapas. Den välkända objektmetadatalistan finns i MSBuild välkända objektmetadata.
I följande exempel transformeras en lista över .resx-filer till en lista över .resources-filer . Transformeringsmodifieraren %(filename) anger att varje .resources-fil har samma filnamn som motsvarande .resx-fil :
@(RESXFile->'%(filename).resources')
Om objekten @(RESXFile) i objektlistan är Form1.resx, Form2.resx och Form3.resx innehåller den transformerade listan utdata från Form1.resources, Form2.resources och Form3.resources.
Anmärkning
Standardavgränsaren för objekt i en transformerad lista är semikolonet ;. Du kan ange en anpassad avgränsare på samma sätt som du anger en avgränsare för en standardobjektlista. Om du vill separera objekt med ett kommatecken , använder du syntaxen @(RESXFile->'Toolset\%(filename)%(extension)', ',').
Flera transformeringsmodifierare
Ett transformeringsuttryck kan innehålla flera modifierare som kan kombineras i valfri ordning och kan upprepas. I följande exempel ändras namnet på katalogen som innehåller filerna, men filerna behåller det ursprungliga namnet och filnamnstillägget:
@(RESXFile->'Toolset\%(filename)%(extension)')
Om objekten RESXFile i objektlistan är Project1\Form1.resx, Project1\Form2.resx och Project1\Form3.text innehåller den transformerade listan utdataverktygen \Form1.resx, Toolset\Form2.resx och Toolset\Form3.text.
Målmappning och beroendeanalys
Transformeringar garanterar en en-till-en-mappning mellan den transformerade objektlistan och den ursprungliga objektlistan. Om ett mål skapar utdata som är transformeringar av indata kan MSBuild analysera tidsstämplarna för indata och utdata. MSBuild använder informationen för att avgöra om du vill hoppa över, skapa eller delvis återskapa ett mål.
I följande exempel transformeras indata för kopieringsaktiviteten till utdata. Varje fil i objektlistan för indata mappas BuiltAssemblies till en fil i målmappen för uppgiften som anges med hjälp av en transformering i Outputs attributet. Om en fil i BuiltAssemblies objektlistan ändras Copy task körs endast för den ändrade filen och hoppar över alla andra filer.
<Target Name="CopyOutputs"
Inputs="@(BuiltAssemblies)"
Outputs="@(BuiltAssemblies -> '$(OutputPath)%(Filename)%(Extension)')">
<Copy
SourceFiles="@(BuiltAssemblies)"
DestinationFolder="$(OutputPath)"/>
</Target>
Mer information om beroendeanalys och hur du använder transformeringar finns i MSBuild inkrementella versioner för nya eller inaktuella mål.
Projektfil med transformeringar
I följande exempel visas en projektfil för MSBuild som använder transformeringar. Exemplet förutsätter att katalogen c:\sub0\sub1\sub2\sub3 endast innehåller en .xsd-fil och arbetskatalogen är c:\sub0.
<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>
Exemplet genererar följande utdata:
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