As compilações incrementais
As compilações incrementais são compilações são otimizadas para que os destinos que possuem arquivos de saída estão atualizados com relação aos seus arquivos de entrada correspondentes não são executados. Um elemento de destino pode ter um Inputs espera de atributo, que indica os itens de destino como entrada e um Outputs atributo, que indica os itens que ele produz como saída. MSBuild tenta localizar um mapeamento de 1 para 1 entre os valores desses atributos. Se existir em um mapeamento 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 de 1 a 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 mais antigo que o seu arquivo de entrada ou arquivos.
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, o 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 a 1 são normalmente produzidas 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 o 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 o tipo de item ou os arquivos de backup correspondentes não forem excluídos ou modificados depois de executar o destino de Backup, e em seguida, o destino de Backup é ignorado em compilações subseqüentes.
Inferência de saída
MSBuild compara o Inputs e Outputs atributos de um destino para determinar se o destino tem que executar. Idealmente, o conjunto de arquivos existente após a conclusão de uma compilação incremental deve mantidas 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, o MSBuild deve interpretar seus valores, mesmo se o destino que afeta a eles é 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 do atributo de qualquer Output elemento é igual a um parâmetro de entrada tarefas. 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" Se 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 dá a ele o valor true, mas somente se o destino é executado. Se o destino for ignorado, CompileRan não é criado.