MSBuild transformações
Uma transformação é uma conversão individual da coleção de um item em outro.Além de permitir que um projeto para converter coleções de item, o transformações permitir que um destino identificar um mapeamento direto entre suas entradas e saídas.Este tópico explica as transformações e como MSBuild usa-los para criar projetos com mais eficiência.
Transformar modificadores
As transformações não são arbitrárias, mas são limitadas pela sintaxe especial no qual todos os modificadores de transformação devem estar no formato %(ItemMetaDataName).sistema autônomo metadados de item podem ser usado sistema autônomo um modificador de transformação, incluindo o metadados de item conhecidos atribuídos a cada item durante a criação.Para obter uma lista de metadados de item já conhecidos, consulte O MSBuild Well-known metadados de item.
No exemplo a seguir, uma lista de arquivos .resx é transformada em uma lista de arquivos .Recursos.O modificador de transformação %(filename) Especifica que cada arquivo .Recursos tem o mesmo nome de arquivo que o arquivo .resx correspondente.
@(RESXFile->'%(filename).resources')
Observação: |
---|
Você pode especificar um separador personalizado para uma coleção de item transformado da mesma forma, que é possível para uma coleção de itens normais.Por exemplo, para separar uma coleção de itens transformados com uma vírgula (,) em vez do padrão ponto-e-vírgula (;), use o seguinte XML. @(RESXFile->'Toolset\%(filename)%(extension)', ',') |
Se, por exemplo, os itens na coleção @(RESXFile) item forem Form1.resx, Form2.resx, e Form3.resx, as saídas da lista transformado será Form1.resources, Form2.resources, e Form3.resources.
Usando modificadores múltiplos
Uma transformação pode conter vários modificadores, que podem ser combinadas em qualquer ordem, e podem ser repetidos modificadores em uma expressão de transformação.No exemplo a seguir, o nome da pasta que contém os arquivos será alterado, mas os arquivos mantêm a extensão de nome e o arquivo original.
@(RESXFile->'Toolset\%(filename)%(extension)')
Se, por exemplo, os itens contidos no RESXFile coleção de item são Project1\Form1.resx, Project1\Form2.resx, e Project1\Form3.text, as saídas da lista transformado será Toolset\Form1.resx, Toolset\Form2.resx, e Toolset\Form3.text.
Análise de dependência
Transformações garantem um mapeamento um-para-um entre a coleção de itens transformados e a coleção de item original.Assim, se um destino cria saídas são transformações das entradas, MSBuild pode analisar os carimbos de data/hora de entradas e saídas e decida se deseja ignorar, compilação, ou parcialmente re compilação um destino.
No Cópia tarefa no exemplo a seguir, cada arquivo no BuiltAssemblies coleção é mapeado para um arquivo na pasta de destino da tarefa especificada com uma transformação no item a Outputs atributo. Se algum dos arquivos do BuiltAssemblies item colection alterações, o Copy tarefa executará somente para os arquivos alterados e todos os outros arquivos serão ignorados. Para obter mais informações sobre análise de dependência e usar transformações, consulte Como: Criar incrementalmente.
<Target Name="CopyOutputs"
Inputs="@(BuiltAssemblies)"
Outputs="@(BuiltAssemblies -> '$(OutputPath)%(Filename)%(Extension)')">
<Copy
SourceFiles="@(BuiltAssemblies)"
DestinationFolder="$(OutputPath)"/>
</Target>
Exemplo
Descrição
O exemplo a seguir mostra um MSBuild arquivo de projeto usando transformações. Este exemplo assume que um arquivo único .xsd no diretório c:\sub0\sub1\sub2\sub3 e uma diretório de trabalho do c:\sub0.
Código
<Project xmlns="https://schemas.microsoft.com/developer/msbuild/2003">
<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>
Comentários
O exemplo produz a seguinte saída.
rootdir: C:\
fullpath: C:\xmake\sub1\sub2\sub3\myfile.xsd
rootdir + directory + filename + extension: C:\xmake\sub1\sub2\sub3\myfile.xsd
identity: sub1\sub2\sub3\myfile.xsd
filename: myfile
directory: xmake\sub1\sub2\sub3\
relativedir: sub1\sub2\sub3\
extension: .xsd