Transformações do MSBuild

Uma transformação é uma conversão individual de um item de lista para outro. Além de habilitar um projeto converter as listas de itens, uma transformação permite um destino identificar um mapeamento direto entre suas entradas e saídas. Este tópico explica as transformações e como MSBuild a criação de projetos com mais eficiência.

Transformar os modificadores

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). Metadados do item podem ser usado como um modificador de transformação. Isso inclui os metadados de item conhecido é atribuído a cada item quando ele é criado. Para obter uma lista de metadados do item já conhecidos, consulte MSBuild conhecidos metadados de Item.

No exemplo a seguir, uma lista de arquivos. resx é transformada em uma lista de arquivos. Resources. O modificador de transformação de %(filename) Especifica que cada arquivo. Resources tem o mesmo nome de arquivo como um arquivo. resx correspondente.

@(RESXFile->'%(filename).resources')
ObservaçãoObservação

Você pode especificar um separador personalizado para obter uma lista de item transformado da mesma maneira que você especificar um separador para obter uma lista de item padrão. Por exemplo, para separar uma lista de itens transformados usando uma vírgula (,) em vez de vírgula padrão (;), use o seguinte XML.

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

Por exemplo, se os itens na lista de itens @(RESXFile) Form1.resx, Form2.resx, e Form3.resx, as saídas da lista transformada será Form1.resources, Form2.resources, e Form3.resources.

Usando vários modificadores

Uma expressão de transformação pode conter vários modificadores, o que podem ser combinadas em qualquer ordem e podem ser repetidos. No exemplo a seguir, o nome do diretório que contém os arquivos é alterado, mas a extensão de nome de arquivo e o nome original de manter os arquivos.

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

Por exemplo, se os itens que estão contidos no RESXFile item de lista são Project1\Form1.resx, Project1\Form2.resx, e Project1\Form3.text, as saídas da lista transformada será Toolset\Form1.resx, Toolset\Form2.resx, e Toolset\Form3.text.

Análise de dependência

Transformações garantem uma correlação entre a lista de itens transformados e a lista do item original. Portanto, se um destino cria saídas são transformações das entradas, MSBuild pode analisar os carimbos de hora das entradas e saídas e decida se deseja ignorar, construir ou parcialmente reconstruir um destino.

No Copiar tarefa no exemplo a seguir, todos os arquivos do BuiltAssemblies lista item mapeia para um arquivo na pasta de destino da tarefa especificada usando uma transformação na Outputs atributo. Se um arquivo a BuiltAssemblies item da alterações de lista, o Copy tarefa será executada somente para o arquivo alterado e todos os outros arquivos serão ignorados. Para obter mais informações sobre como usar transformações e de análise de dependência, consulte How to: Aumentar incrementalmente.

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

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

</Target>

Exemplo

Descrição

A exemplo a seguir mostra um MSBuild o arquivo de projeto que usa transformações. Este exemplo assume que há apenas um arquivo. xsd no diretório c:\sub0\sub1\sub2\sub3 e que o diretório de trabalho é 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

Consulte também

Tarefas

How to: Aumentar incrementalmente

Outros recursos

MSBuild Concepts

Referência do MSBuild