As compilações incrementais
Compilações incrementais são compilações são otimizadas para que os destinos que possuem arquivos de saída que são atualizados em relação aos arquivos de entrada correspondentes não serão executados.Um elemento de destino pode ter ambos um Inputs espera de atributo, que indica os itens de destino como entrada e um Outputs atributo, que indica os itens produz como saída.MSBuild tenta localizar um mapeamento 1-para-1 entre os valores desses atributos.Se existe um mapeamento de 1-para-1, o MSBuild compara o carimbo de hora de cada item de entrada para o carimbo de hora de seu item de saída correspondente.Arquivos de saída que não tenha nenhum mapeamento 1-para-1 são comparados a todos os arquivos de entrada.Um item é considerado atualizadas se o seu arquivo de saída é a mesma idade ou com mais de seus arquivos ou um arquivo de entrada.
Se todos os itens de saída estão atualizados, o MSBuild ignora o destino.Isso compilação incremental do destino pode melhorar significativamente a velocidade de compilação.Se apenas alguns arquivos estão atualizados, MSBuild executa o destino, mas ignora os itens atualizados e, assim, traz todos os itens atualizados.Isso é conhecido como um parcial compilação incremental.
mapeamentos de 1-para-1 em geral são produzidos por transformações do item.Para obter mais informações, consulte Transformações do MSBuild.
Considere o seguinte destino.
<Target Name="Backup" Inputs="@(Compile)"
Outputs="@(Compile->'$(BackupFolder)%(Identity).bak')">
<Copy SourceFiles="@(Compile)" DestinationFiles=
"@(Compile->'$(BackupFolder)%(Identity).bak')" />
</Target>
O conjunto de arquivos representados pela Compile tipo de item são copiados para um diretório de backup.Os arquivos de backup têm a extensão de nome de arquivo. bak.Se os arquivos são representados pela Compile tipo de item ou os arquivos de backup correspondentes, não forem excluídos ou modificados depois que o destino de Backup é executado, e em seguida, o destino de Backup é ignorado em compilações subseqüentes.
Inferência de tipos de saída
MSBuild compara o Inputs e Outputs atributos de um destino para determinar se o destino tem de executar.O ideal é que o conjunto de arquivos existente após a conclusão de uma compilação incremental deve permanecer-os mesmos independentemente de serem ou não os destinos associados são executados.Como propriedades e os itens que são criados ou alterados por tarefas podem afetar a compilação, MSBuild deve interpretar seus valores, mesmo se o destino que afeta-los é ignorado.Isso é conhecido como a inferência de saída.
Há três casos:
O destino tem um Condition atributo que é avaliada como false.Nesse caso, o destino não é executado e não tem efeito sobre a compilação.
O destino tem saídas desatualizadas e é executado para trazê-los atualizados.
O destino não tem desatualizadas saídas e é ignorado.MSBuild avalia o destino e faz alterações em itens e propriedades, como se fosse executado no destino.
Para dar suporte à compilação incremental, tarefas devem garantir que o TaskParameter o valor de qualquer do atributo Output elemento é igual a um parâmetro de entrada de tarefa.Aqui estão alguns exemplos:
<CreateProperty Value="123">
<Output PropertyName="Easy" TaskParameter="Value" />
</CreateProperty>
Isso cria a propriedade fácil, que tem o valor "123" ou não o destino é executado ou ignorado.
<CreateItem Include="a.cs;b.cs">
<Output ItemName="Simple" TaskParameter="Include" />
</CreateItem>
Isso cria o tipo de item simples, que tem dois itens, "a.cs" e "b.cs", ou não o destino é executado ou ignorado.
No MSBuild 3.5, a inferência de tipos de saída é executada automaticamente em grupos de item e a propriedade em um destino.CreateItemtarefas não são necessários em um destino e devem ser evitadas.Além disso, CreateProperty tarefas devem ser usadas em um destino apenas para determinar se um destino foi executado.
Determinando se um destino tenha sido executado.
Por causa da inferência de saída, você terá que adicionar uma CreateProperty a tarefa para um destino para examinar as propriedades e os itens para que você possa determinar se o destino foi executado.Adicionar o CreateProperty de tarefas para o destino e dê a ele um Output elemento cuja TaskParameter é "ValueSetByTask".
<CreateProperty Value="true">
<Output TaskParameter="ValueSetByTask" PropertyName="CompileRan" />
</CreateProperty>
Isso cria a propriedade CompileRan e atribui o valor true, mas somente se o destino é executado.Se o destino for ignorado, CompileRan não é criado.