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>