How to: Aumentar incrementalmente
Quando você cria um projeto grande, é importante que anteriormente criados de componentes que são atualizados ainda não são reconstruídos. Se todos os destinos são criados cada vez, cada compilação levará muito tempo para concluir. Para ativar as compilações incrementais (compilações em que somente esses destinos que não foram criados antes ou destinos que estão desatualizados, são recriadas), o Mecanismo de compilação Microsoft (MSBuild) pode comparar os carimbos de hora dos arquivos de entrada com carimbos de hora dos arquivos de saída e determine se deseja ignorar, construir ou parcialmente reconstruir um destino. No entanto, deve haver um mapeamento individual entre entradas e saídas. Você pode usar transformações para habilitar os destinos identificar esse mapeamento direto. Para obter mais informações sobre transformações, consulte Transformações do MSBuild.
Especificando entradas e saídas
Um destino pode ser criado incrementalmente se as entradas e saídas são especificadas no arquivo de projeto.
Para especificar as entradas e saídas para um destino.
Use o Inputs e Outputs atributos a Target elemento. Por exemplo:
<Target Name="Build"
Inputs="@(CSFile)"
Outputs="hello.exe">
MSBuildpode comparar os carimbos de hora dos arquivos de entrada com carimbos de hora dos arquivos de saída e determinar se deve ignorar, criar ou recriar parcialmente o destino. No exemplo a seguir, se qualquer arquivo no @(CSFile) item de lista é mais recente que o arquivo Hello. exe, MSBuild executará o destino; Caso contrário, ele será ignorado:
<Target Name="Build"
Inputs="@(CSFile)"
Outputs="hello.exe">
<Csc
Sources="@(CSFile)"
OutputAssembly="hello.exe"/>
</Target>
Quando entradas e saídas são especificadas em um destino, cada saída pode mapear apenas uma entrada ou pode haver um mapeamento direto entre as entradas e saídas. No anterior CSC tarefa, por exemplo, a saída Hello. exe, não pode ser mapeado para qualquer entrada única – ele depende de todas elas.
Observação |
---|
Um destino no qual não há nenhum mapeamento direto entre as entradas e saídas sempre criará com mais freqüência do que um destino no qual cada saída pode mapear apenas uma entrada porque MSBuild não pode determinar quais saídas precisam ser recriados se algumas das entradas foram alteradas. |
Tarefas que você pode identificar um mapeamento direto entre as saídas e entradas, como o Tarefa de LC, que são mais adequados para as compilações incrementais, ao contrário de tarefas, como Csc e Vbc, que produzem um assembly de saída de um número de entradas.
Exemplo
O exemplo a seguir utiliza um projeto que compila os arquivos de ajuda para um sistema de ajuda hipotético. O projeto funciona através da conversão de arquivos de origem. txt em arquivos de .content de intermediário, que são combinados com arquivos de metadados XML para produzir o arquivo .help final usado pelo sistema de Ajuda. O projeto utiliza as seguintes tarefas hipotéticos:
GenerateContentFiles: Converte arquivos. txt .content arquivos.
BuildHelp: Combina arquivos de .content e arquivos de metadados XML para criar o arquivo final .help.
O projeto usa transformações para criar um mapeamento individual entre entradas e saídas no GenerateContentFiles de tarefas. Para obter mais informações, consulte Transformações do MSBuild. Além disso, o Output elemento está definido para usar automaticamente as saídas da GenerateContentFiles tarefa como entradas para o BuildHelp de tarefas.
Este arquivo de projeto contém ambos os Convert e Build destinos. O GenerateContentFiles e BuildHelp tarefas são colocadas na Convert e Build destinos, respectivamente, para que cada destino pode ser construído de forma incremental. Usando o Output elemento, as saídas da GenerateContentFiles tarefa são colocados na ContentFile lista de item, onde eles podem ser usados como entradas para o BuildHelp de tarefas. Usando o Output elemento dessa maneira fornece automaticamente as saídas de uma tarefa, como as entradas para outra tarefa para que você não tenha que lista os itens individuais ou um item de lista manualmente em cada tarefa.
Observação |
---|
Embora o GenerateContentFiles destino pode aumentar incrementalmente, todas as saídas de destino sempre são necessárias como entradas para o BuildHelp de destino. MSBuildfornece automaticamente todas as saídas de um destino como entradas para outro destino ao usar o Output elemento. |
<Project DefaultTargets="Build"
xmlns="https://schemas.microsoft.com/developer/msbuild/2003" >
<ItemGroup>
<TXTFile Include="*.txt"/>
<XMLFile Include="\metadata\*.xml"/>
</ItemGroup>
<Target Name = "Convert"
Inputs="@(TXTFile)"
Outputs="@(TXTFile->'%(Filename).content')">
<GenerateContentFiles
Sources = "@(TXTFile)">
<Output TaskParameter = "OutputContentFiles"
ItemName = "ContentFiles"/>
</GenerateContentFiles>
</Target>
<Target Name = "Build" DependsOnTargets = "Convert"
Inputs="@(ContentFiles);@(XMLFiles)"
Outputs="$(MSBuildProjectName).help">
<BuildHelp
ContentFiles = "@(ContentFiles)"
MetadataFiles = "@(XMLFile)"
OutputFileName = "$(MSBuildProjectName).help"/>
</Target>
</Project>