Usar o mesmo destino em vários arquivos de projeto

Se tiver criado vários arquivos de projeto do MSBuild, talvez você tenha descoberto que precisa usar as mesmas tarefas e destinos em diferentes arquivos de projeto. Em vez de incluir a descrição completa dessas tarefas ou destinos em todos os arquivos de projeto, você pode salvar um destino em um arquivo de projeto separado e, em seguida, importar o projeto para qualquer outro projeto que precise usar o destino.

Usar o elemento Import

O elemento Import é usado para inserir um arquivo de projeto em outro arquivo de projeto. O arquivo de projeto que está sendo importado deve ser um arquivo de projeto do MSBuild válido e conter XML bem formado. O atributo Project especifica o caminho para o arquivo de projeto importado. Para obter mais informações sobre o elemento Import, confira Elemento Import (MSBuild).

Para importar um projeto

  1. Defina, no arquivo de projeto para o qual está sendo realizada a importação, todas as propriedades e itens que são usados como parâmetros para propriedades e itens no projeto importado.

  2. Use o elemento Import para importar o projeto. Por exemplo:

    <Import Project="MyCommon.targets"/>

  3. Após o elemento Import, defina todas as propriedades e itens que devem substituir as definições padrão de propriedades e itens no projeto importado.

Ordem de avaliação

Quando o MSBuild atinge um elemento Import, o projeto importado é inserido efetivamente no projeto para o qual está sendo realizada a importação, no local do elemento Import. Portanto, o local do elemento Import pode afetar os valores de propriedades e de itens. É importante entender as propriedades e os itens que são definidos pelo projeto importado e as propriedades e itens usados pelo projeto importado.

Quando o projeto é compilado, todas as propriedades são avaliadas primeiro, seguidas dos itens. Por exemplo, o seguinte XML define o arquivo de projeto importado MyCommon.targets:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Name>MyCommon</Name>
    </PropertyGroup>

    <Target Name="Go">
        <Message Text="Name=$(Name)"/>
    </Target>
</Project>

O seguinte XML define MyApp.proj, que importa MyCommon.targets:

<Project
    DefaultTargets="Go"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Name>MyApp</Name>
    </PropertyGroup>
    <Import Project="MyCommon.targets"/>
</Project>

Quando o projeto é compilado, a seguinte mensagem é exibida:

Name="MyCommon"

Como o projeto é importado depois de a propriedade Name ser definida em MyApp.proj, a definição de Name em MyCommon.targets substitui a definição em MyApp.proj. Se o projeto é importado antes de a propriedade Name ser definida, o build exibe a seguinte mensagem:

Name="MyApp"

Usar a abordagem a seguir ao importar projetos

  1. Defina, no arquivo de projeto, todas as propriedades e itens que são usados como parâmetros para propriedades e itens no projeto importado.

  2. Importe o projeto.

  3. Defina, no arquivo de projeto, todas as propriedades e itens que devem substituir as definições padrão de propriedades e itens no projeto importado.

Exemplo 1

O exemplo de código a seguir mostra o arquivo MyCommon.targets, importado pelo segundo exemplo de código. O arquivo .targets avalia propriedades do projeto de importação para configurar o build.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Flavor Condition="'$(Flavor)'==''">DEBUG</Flavor>
        <Optimize Condition="'$(Flavor)'=='RETAIL'">yes</Optimize>
        <appname>$(MSBuildProjectName)</appname>
    <PropertyGroup>
    <Target Name="Build">
        <Csc Sources="hello.cs"
            Optimize="$(Optimize)"
            OutputAssembly="$(appname).exe"/>
    </Target>
</Project>

Exemplo 2

O exemplo de código a seguir importa o arquivo MyCommon.targets.

<Project DefaultTargets="Build"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <Flavor>RETAIL</Flavor>
    </PropertyGroup>
    <Import Project="MyCommon.targets"/>
</Project>