Selezionare i file da compilare

Nella maggior parte dei progetti non è necessario selezionare in modo specifico i file da compilare. Ad esempio, qualsiasi progetto creato con Visual Studio compila tutti i file di origine nel progetto. Tuttavia, potrebbe essere necessario sapere come modificare il file di progetto per gestire scenari diversi da quelli predefiniti, ad esempio quando si vogliono compilare file da altri percorsi esterni alle cartelle del progetto o quando si crea un processo di compilazione personalizzato invece di usare un SDK come .NET SDK.

Comportamento predefinito per tipo di progetto

Comportamento predefinito che determina i file inclusi da MSBuild nella compilazione in base al tipo di progetto.

Per i progetti .NET SDK, .NET SDK standard definisce un elenco di elementi predefinito Compile che contiene i file nell'albero delle cartelle del progetto che corrispondono all'estensione di file specifica del linguaggio appropriata. Ad esempio, per un progetto C#, l'elemento Compile viene popolato con il modello **/*.csGLOB , che corrisponde a tutti i file di origine nella cartella del progetto e a tutte le relative sottocartelle in modo ricorsivo. L'elemento Compile non viene visualizzato nel file di progetto, perché è definito nel file SDK .props importato in modo implicito. Vedere Panoramica di .NET Project SDK: inclusioni ed esclusioni predefinite.

Se si usa Visual Studio, è possibile modificare il set di file di origine da compilare modificando l'azione di compilazione in un file. Impostarlo su None per escludere un file dalla compilazione. Questa operazione in Visual Studio influisce sul file di progetto. Si noterà che le righe sono state aggiunte per rimuovere il file di origine dall'elenco Compile di elementi e aggiungerlo all'elenco None di elementi.

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

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

Per .NET Framework o altri progetti non SDK, l'elemento Compile viene costruito in modo esplicito nel file di progetto elencando tutti i file di origine.

Per i progetti C++, i file di origine vengono aggiunti in modo esplicito all'elemento ClCompile nel file di progetto.

Quando si crea a mano un file di progetto MSBuild senza usare un SDK, è possibile elencare ogni file di origine separatamente nel file di progetto oppure usare caratteri jolly per includere tutti i file in una directory o in un set annidato di directory. È anche possibile usare le tecniche descritte in questo articolo per modificare l'elenco di elementi (in progetti .NET) o ClCompile l'elenco Compile di elementi nei progetti C++ per personalizzare i file compilati.

Specificare gli input

Gli elementi rappresentano gli input (ad esempio i file di origine) per una compilazione. Per altre informazioni sugli elementi, vedere Elementi.

Per includere i file per una compilazione, devono essere inclusi in un elenco di elementi. Come descritto in precedenza, nei progetti .NET SDK e .NET Framework l'elenco di elementi per i file di origine è Compile. Non viene visualizzato l'elenco Compile di elementi nei progetti .NET SDK, perché è definito nelle importazioni implicite. Vedere Usare gli SDK del progetto.

I file di progetto che non si basano sulle importazioni standard possono usare un nome di elenco di elementi arbitrari, ad esempio VBFile o CSFile. Vedere l'esempio 1 e l'esempio 2 più avanti in questo articolo. Per configurare una compilazione basata sull'elenco di elementi, passare questo nome a un'attività di compilazione, come descritto più avanti in questo articolo.

È possibile aggiungere più file agli elenchi di elementi includendoli uno alla volta o usando i caratteri jolly per includere molti file allo stesso tempo.

Per dichiarare gli elementi uno alla volta

  • Usare gli attributi Include simili ai seguenti:

    <Compile Include="Form1.cs"/>

    or

    <Compile Include="Form1.vb"/>

    Nota

    Se gli elementi di una raccolta di elementi non si trovano nella stessa directory del file di progetto, è necessario specificare il percorso completo o relativo dell'elemento. Ad esempio: Include="..\..\Form2.cs".

Lo stesso elenco di elementi può essere modificato ripetutamente da più Include attributi. Ognuno Include aggiunge a quello che c'era in precedenza.

Per dichiarare più elementi

  • Usare gli attributi Include simili ai seguenti:

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

    or

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

Specificare gli input con caratteri jolly

È anche possibile usare caratteri jolly per includere in modo ricorsivo tutti i file o solo file specifici dalle sottodirectory come input per una compilazione. Per altre informazioni sui caratteri jolly, vedere Elementi

Gli esempi seguenti si basano su un progetto che contiene file grafici nelle directory e sottodirectory seguenti. Il file di progetto si trova nella directory Project:

Project\Images\BestJpgs

Project\Images\ImgJpgs

Project\Images\ImgJpgs\Img1

Per includere tutti i file con estensione jpg della directory Images e delle relative sottodirectory

  • Usare l'attributo Include seguente:

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

Per includere tutti i file jpg che iniziano con img

  • Usare l'attributo Include seguente:

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

Per includere tutti i file delle directory i cui nomi terminano con jpgs

  • Usare uno degli attributi Include seguenti:

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

    or

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

Esclusione e rimozione di elementi

È possibile specificare i file che corrispondono a un determinato modello, con alcune eccezioni. È possibile eseguire questa operazione in una singola operazione con una combinazione di Include e Exclude.

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

Per rimuovere un elemento incluso in precedenza o incluso per impostazione predefinita da un SDK, è possibile usare l'attributo Remove .

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

Passare elementi a un'attività o a una destinazione

Nella maggior parte dei file di progetto non è necessario passare in modo esplicito l'elemento a una destinazione o a un'attività Compile , poiché questa operazione viene gestita dalle importazioni standard. Tuttavia, nel caso di un file di progetto di destinazione, è possibile usare la @() notazione nelle attività per specificare un intero elenco di elementi come input per una compilazione. È possibile usare questa notazione se si elencano tutti i file separatamente, altrimenti usare i caratteri jolly.

Per usare tutti i file C# o Visual Basic come input per un'attività del compilatore

  • Usare gli attributi Include simili ai seguenti:

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

    or

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

Nota

È necessario usare caratteri jolly con elementi per specificare gli input per una compilazione; non è possibile specificare gli input usando l'attributo Sources nelle attività di MSBuild, ad esempio Csc o Vbc. L'esempio seguente non è valido in un file di progetto:

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

Esempio 1

L'esempio di codice seguente illustra un progetto che include tutti i file di input separatamente.

<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>

Esempio 2

L'esempio di codice seguente usa un carattere jolly per includere tutti i file con estensione 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>