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 atributoProject
especifica os destinos que serão executados primeiro, mesmo se os destinos foram especificados na linha de comando ou no atributoDefaultTargets
.DefaultTargets
. Esse atributoProject
especifica quais destinos são executados se um destino não for especificado explicitamente na linha de comando.DependsOnTargets
. Este atributoTarget
especifica os destinos que devem ser executados antes que esse destino possa ser executado.BeforeTargets
eAfterTargets
. Esses atributosTarget
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:
Os destinos
InitialTargets
são executados.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.O atributo
Condition
do destino é avaliado. Se o atributoCondition
estiver presente e for avaliado comofalse
, o destino não será executado e não terá nenhum efeito adicional no build.Outros destinos que listam o destino condicional em
BeforeTargets
ouAfterTargets
ainda são executados na ordem indicada.Antes de o destino ser executado ou ignorado, seus destinos
DependsOnTargets
são executados, a menos que o atributoCondition
seja aplicado ao destino e avaliado comofalse
.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.
Antes de o destino ser executado ou ignorado, qualquer outro tipo de destino que listar o destino em um atributo
BeforeTargets
será executado.Antes de o destino ser executado, seu atributo
Inputs
e o atributoOutputs
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.Após o destino ser executado ou ignorado, qualquer outro destino que o listar em um atributo
AfterTargets
será executado.