Ordem de build de destino

Os destinos deverão ser ordenados se a entrada para um destino depender da saída de outro. É possível usar esses atributos para especificar a ordem na qual os destinos são executados:

  • InitialTargets. Este atributo Project especifica os destinos que serão executados primeiro, mesmo se os destinos foram especificados na linha de comando ou no atributo DefaultTargets.

  • DefaultTargets. Esse atributo Project especifica quais destinos são executados se um destino não for especificado explicitamente na linha de comando.

  • DependsOnTargets. Este atributo Target especifica os destinos que devem ser executados antes que esse destino possa ser executado.

  • BeforeTargets e AfterTargets. Esses atributos Target especificam que esse destino deve ser executado antes ou após os destinos especificados.

Em geral, você não deve depender da ordem de declaração para especificar quais tarefas são executadas antes das outras.

Um destino nunca é executado duas vezes durante um build, mesmo se um destino posterior no build depende dele. Depois que um destino tiver sido executado, sua contribuição para o build será concluída.

Os destinos podem ter um atributo Condition. Se a condição especificada for avaliada como false, o destino não será executado e não terá nenhum efeito no build. Para obter mais informações sobre condições, consulte Condições.

Destinos Iniciais

O atributo InitialTargets do elemento Project especifica os destinos que serão executados primeiro, mesmo se os destinos forem especificados na linha de comando ou no atributo DefaultTargets. Normalmente, os destinos iniciais são usados para verificação de erros.

O valor do atributo InitialTargets pode ser uma lista ordenada de destinos, delimitada por ponto e vírgula. O exemplo a seguir especifica que o destino Warm é executado e, em seguida, que o destino Eject é executado.

<Project InitialTargets="Warm;Eject" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

Os projetos importados podem ter seus próprios atributos InitialTargets. Todos os destinos iniciais são agregados juntos e executados na ordem.

Para saber mais, consulte Como especificar qual destino será compilado primeiro.

Destinos padrão

O atributo DefaultTargets do elemento Project especifica quais destinos serão compilados se um destino não for especificado explicitamente em uma linha de comando.

O valor do atributo DefaultTargets pode ser uma lista de destinos padrão, delimitada por ponto e vírgula. O exemplo a seguir especifica que o destino Clean é executado e, em seguida, que o destino Build é executado.

<Project DefaultTargets="Clean;Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

É possível substituir os destinos padrão usando a opção –target na linha de comando. O exemplo a seguir especifica que o destino Build é executado e, em seguida, que o destino Report é executado. Ao especificar destinos dessa forma, os destinos padrão são ignorados.

msbuild -target:Build;Report

Se forem especificados destinos iniciais e destinos padrão e nenhum destino de linha de comando for especificado, o MSBuild executará os destinos iniciais primeiro e, em seguida, os destinos padrão.

Os projetos importados podem ter seus próprios atributos DefaultTargets. O primeiro atributo DefaultTargets encontrado determina quais destinos padrão serão executados.

Para saber mais, consulte Como especificar qual destino será compilado primeiro.

Primeiro destino

Se não houver nenhum destino inicial, destino padrão ou destino de linha de comando, o MSBuild executará o primeiro destino encontrado no arquivo de projeto ou nos arquivos de projeto importados.

Dependências de destino

Os destinos podem descrever relações de dependência entre si. O atributo DependsOnTargets indica que um destino depende de outros destinos. Por exemplo,

<Target Name="Serve" DependsOnTargets="Chop;Cook" />

informa ao MSBuild que o destino Serve depende dos destino Chop e Cook. O MSBuild executa o destino Chop e, em seguida, o destino Cook antes de executar o destino Serve.

Observação

Os destinos padrão no SDK definem um número de propriedades DependsOn que contêm a lista de destinos que são dependências para esse destino (por exemplo, $(BuildDependsOn), $(CleanDependsOn) e assim por diante). Por exemplo,

<Target Name="Build" DependsOnTargets="$(BuildDependsOn)">

Para personalizar um projeto, substitua as propriedades DependsOn com destinos personalizados adicionais que estendem o processo de build, conforme descrito em Estender o processo de build do Visual Studio.

BeforeTargets e AfterTargets

É possível especificar a ordem de destinos usando os atributos BeforeTargets e AfterTargets.

Considere o script a seguir.

<Project DefaultTargets="Compile;Link" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Compile">
        <Message Text="Compiling" />
    </Target>
    <Target Name="Link">
        <Message Text="Linking" />
    </Target>
</Project>

Para criar um destino intermediário Optimize que é executado após o destino Compile, mas antes do destino Link, adicione o destino a seguir em qualquer lugar do elemento Project.

<Target Name="Optimize" AfterTargets="Compile">
    <Message Text="Optimizing" />
</Target>

Como alternativa, especifique a ordem como

<Target Name="Optimize" BeforeTargets="Link">
    <Message Text="Optimizing" />
</Target>

Não é útil especificar ambos BeforeTargets e AfterTargets no mesmo destino. Conforme descrito na próxima seção, apenas o primeiro destino encontrado fará com que o novo destino seja executado.

Determinar a ordem de compilação de destino

O MSBuild determina a ordem de build de destinos da seguinte maneira:

  1. Os destinos InitialTargets são executados.

  2. Os destinos especificados na linha de comando pela opção –target são executados. Se você não especificar nenhum destino na linha de comando, os destinos DefaultTargets serão executados. Se nenhum deles estiver presente, o primeiro destino encontrado será executado.

  3. O atributo Condition do destino é avaliado. Se o atributo Condition estiver presente e for avaliado como false, o destino não será executado e não terá nenhum efeito adicional no build.

    Outros destinos que listam o destino condicional em BeforeTargets ou AfterTargets ainda são executados na ordem indicada.

  4. Antes de o destino ser executado ou ignorado, seus destinos DependsOnTargets são executados, a menos que o atributo Condition seja aplicado ao destino e avaliado como false.

    Observação

    Um destino será considerado ignorado se não for executado porque seus itens de saída estão atualizados (consulte build incremental). Essa verificação é feita antes de executar as tarefas dentro do destino e não afeta a ordem de execução dos destinos.

  5. Antes de o destino ser executado ou ignorado, qualquer outro tipo de destino que listar o destino em um atributo BeforeTargets será executado.

  6. Antes de o destino ser executado, seu atributo Inputs e o atributo Outputs serão comparados. Se o MSBuild determinar que os arquivos de saída estão desatualizados em relação aos arquivos de entrada correspondentes, ele executará o destino. Caso contrário, o MSBuild ignorará o destino.

  7. Após o destino ser executado ou ignorado, qualquer outro destino que o listar em um atributo AfterTargets será executado.