Selecionar os arquivos a serem compilados

Na maioria dos projetos, você não precisa selecionar especificamente os arquivos que serão compilados. Por exemplo, qualquer projeto criado com o Visual Studio cria todos os arquivos de origem no projeto. No entanto, talvez você precise saber como editar seu arquivo de projeto para abordar cenários diferentes do padrão, p. ex., quando você deseja compilar arquivos de outros locais fora das pastas do projeto ou quando você está criando seu próprio processo de compilação em vez de usar um SDK como o SDK do .NET.

Comportamento padrão por tipo de projeto

O comportamento padrão que determina quais arquivos o MSBuild inclui no build difere por tipo de projeto.

Para projetos do SDK do .NET, o SDK do .NET padrão define uma lista de itens padrãoCompile que contém arquivos na árvore de pastas do projeto que correspondem à extensão adequada de arquivo específica a uma linguagem. Por exemplo, para um projeto em C#, o item Compile é preenchido com o padrão glob **/*.cs, que corresponde a todos os arquivos de origem na pasta do projeto e a todas as suas subpastas recursivamente. Você não vê o elemento Compile no arquivo de projeto, porque ele é definido no arquivo .props do SDK que é importado implicitamente. Consulte Visão geral do SDK do projeto .NET: inclusões e exclusões padrão.

Se você estiver usando o Visual Studio, poderá modificar o conjunto de arquivos de origem do build alterando a Ação de compilação em um arquivo. Defina-a como None para excluir um arquivo do build. Fazer isso no Visual Studio afeta o arquivo de projeto. Você verá que houve a adição de linhas para remover o arquivo de origem da lista de itens Compile e adicioná-lo à lista de itens None.

  <ItemGroup>
    <Compile Remove="Class.cs" />
  </ItemGroup>

  <ItemGroup>
    <None Include="Class.cs" />
  </ItemGroup>

Para o .NET Framework ou outros projetos não relacionados a um SDK, o item Compile é construído explicitamente no arquivo de projeto listando todos os arquivos de origem.

Para projetos em C++, os arquivos de origem são adicionados explicitamente ao elemento ClCompile no arquivo de projeto.

Quando você cria manualmente um arquivo de projeto do MSBuild sem usar um SDK, é possível listar cada arquivo de origem separadamente no arquivo de projeto ou usar caracteres curinga para incluir todos os arquivos em um diretório ou um conjunto aninhado de diretórios. Também é possível usar as técnicas neste artigo para modificar a lista de itens Compile (em projetos .NET) ou a lista de itens ClCompile em projetos C++ para personalizar quais arquivos são compilados.

Especificar entradas

Os itens representam as entradas (como arquivos de origem) para um build. Para obter mais informações sobre os itens, consulte Itens.

Para incluir arquivos em um build, eles devem estar incluídos em uma lista de itens. Conforme discutido anteriormente, em projetos .NET Framework e de SDK do .NET, a lista de itens para os arquivos de origem é Compile. Você não vê a lista de itens Compile em projetos do SDK do .NET, porque ela é definida nas importações implícitas. Confira Usar SDKs de projeto.

Os arquivos de projeto que não dependam das importações padrão podem usar um nome arbitrário de lista de itens, como VBFile ou CSFile. Consulte o Exemplo 1 e o Exemplo 2 posteriormente neste artigo. Para configurar um build com base na lista de itens, você transmite isso pelo nome para uma tarefa de compilação, conforme discutido posteriormente neste artigo.

Vários arquivos podem ser adicionados a listas de itens incluindo os arquivos individualmente ou usando caracteres curinga para incluir vários arquivos ao mesmo tempo.

Para declarar itens individualmente

  • Use os atributos Include semelhantes ao seguinte:

    <Compile Include="Form1.cs"/>

    ou

    <Compile Include="Form1.vb"/>

    Observação

    Se os itens em uma coleção de itens não estiverem no mesmo diretório que o arquivo de projeto, será necessário especificar o caminho completo ou relativo para o item. Por exemplo: Include="..\..\Form2.cs".

É possível modificar repetidamente a mesma lista de itens por vários atributos Include. Cada Include é somado ao que havia anteriormente.

Para declarar vários itens

  • Use os atributos Include semelhantes ao seguinte:

    <Compile Include="Form1.cs;Form2.cs"/>

    ou

    <Compile Include="Form1.vb;Form2.vb"/>

Especificar entradas com curingas

Você também pode usar caracteres curinga para incluir recursivamente todos os arquivos ou apenas arquivos específicos de subdiretórios como entradas para um build. Para obter mais informações sobre caracteres curinga, consulte Itens

Os seguintes exemplos baseiam-se em um projeto que contém arquivos de elementos gráficos nos seguintes diretórios e subdiretórios, com o arquivo de projeto localizado no diretório Project:

Project\Images\BestJpgs

Project\Images\ImgJpgs

Project\Images\ImgJpgs\Img1

Para incluir todos os arquivos .jpg no diretório Images e nos subdiretórios

  • Use o seguinte atributo Include:

    Include="Images\**\*.jpg"

Para incluir todos os arquivos .jpg que começam com img

  • Use o seguinte atributo Include:

    Include="Images\**\img*.jpg"

Para incluir todos os arquivos em diretórios com nomes que terminam com jpgs

  • Use um dos seguintes atributos Include:

    Include="Images\**\*jpgs\*.*"

    or

    Include="Images\**\*jpgs\*"

Excluindo e removendo itens

Talvez você queira especificar arquivos que correspondam a um determinado padrão, com algumas exceções. É possível fazer isso em uma única operação com uma combinação de Include e Exclude.

<ItemGroup>
  <!-- Include every C# source file, except anything in the "sub" folder -->
  <Compile Include="**/*.cs" Exclude="sub/**/*.cs">
</ItemGroup>

Para remover um item que foi incluído anteriormente ou foi incluído por padrão por um SDK, você pode usar o atributo Remove.

<ItemGroup>
  <!-- Remove anything in the "sub" folder -->
  <Compile Remove="sub/**/*.cs">
</ItemGroup>

Transmitir itens a uma tarefa ou destino

Na maioria dos arquivos de projeto, você não precisa transmitir explicitamente o item Compile para um destino ou tarefa, já que isso é gerenciado pelas importações padrão. Porém, no caso de um destino do arquivo de projeto, você pode usar a notação @() em tarefas para especificar uma lista completa de itens como a entrada para um build. Você pode usar essa notação se listar todos os arquivos separadamente ou usar caracteres curinga.

Para usar todos os arquivos do C# ou Visual Basic como entradas em uma tarefa de compilador

  • Use os atributos Include semelhantes ao seguinte:

    <CSC Sources="@(CSFile)">...</CSC>

    ou

    <VBC Sources="@(VBFile)">...</VBC>

Observação

Use curingas com itens para especificar as entradas para um build; não é possível especificar as entradas usando o atributo Sources em tarefas do MSBuild como Csc ou Vbc. O exemplo a seguir não é válido em um arquivo de projeto:

<CSC Sources="*.cs">...</CSC>

Exemplo 1

O exemplo de código a seguir mostra um projeto que inclui todos os arquivos de entrada separadamente.

<Project DefaultTargets="Compile"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
    <PropertyGroup>
        <Builtdir>built</Builtdir>
    </PropertyGroup>

    <ItemGroup>
        <CSFile Include="Form1.cs"/>
        <CSFile Include="AssemblyInfo.cs"/>

        <Reference Include="System.dll"/>
        <Reference Include="System.Data.dll"/>
        <Reference Include="System.Drawing.dll"/>
        <Reference Include="System.Windows.Forms.dll"/>
        <Reference Include="System.XML.dll"/>
    </ItemGroup>

    <Target Name="PreBuild">
        <Exec Command="if not exist $(builtdir) md $(builtdir)"/>
    </Target>

    <Target Name="Compile" DependsOnTargets="PreBuild">
        <Csc Sources="@(CSFile)"
            References="@(Reference)"
            OutputAssembly="$(builtdir)\$(MSBuildProjectName).exe"
            TargetType="exe" />
    </Target>
</Project>

Exemplo 2

O exemplo de código a seguir usa um curinga para incluir todos os arquivos .cs.

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

    <PropertyGroup>
        <builtdir>built</builtdir>
    </PropertyGroup>

    <ItemGroup>
        <CSFile Include="*.cs"/>

        <Reference Include="System.dll"/>
        <Reference Include="System.Data.dll"/>
        <Reference Include="System.Drawing.dll"/>
        <Reference Include="System.Windows.Forms.dll"/>
        <Reference Include="System.XML.dll"/>
    </ItemGroup>

    <Target Name="PreBuild">
        <Exec Command="if not exist $(builtdir) md $(builtdir)"/>
    </Target>

    <Target Name="Compile" DependsOnTargets="PreBuild">
        <Csc Sources="@(CSFile)"
            References="@(Reference)"
            OutputAssembly="$(builtdir)\$(MSBuildProjectName).exe"
            TargetType="exe" />
    </Target>
</Project>