Condividi tramite


Escludere file dalla compilazione

In un file di progetto è possibile usare caratteri jolly per includere tutti i file in una directory o in un set annidato di directory come input per una compilazione. Tuttavia, potrebbe essere presente un file nella directory o una directory in un set annidato di directory che non si vuole includere come input per una compilazione. È possibile escludere in modo esplicito tale file o directory dall'elenco di input. In un progetto potrebbe anche essere presente un file che si vuole includere solo in determinate condizioni. È possibile dichiarare in modo esplicito le condizioni in cui un file viene incluso in una compilazione.

Nota

Le tecniche descritte in questo articolo non sono applicabili a F# e C++. Questi sistemi di progetto gestiscono i file di origine stessi.

Escludere un file con Visual Studio

Se si usa Visual Studio, selezionare il file in Esplora soluzioni, visualizzare la finestra Proprietà (premere ALT+INVIO) e impostare Azione di compilazione su Nessuno.

Ciò comporta le modifiche seguenti nel file di progetto MSBuild:

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

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

Questo funziona bene per alcuni file, ma non aumenta fino a un numero maggiore di file o file che corrispondono a un determinato modello. Nei progetti .NET è possibile usare MSBuild per escludere file e directory usando un'espressione con caratteri jolly, denominata anche glob, come descritto di seguito.

Escludere file o directory nei progetti .NET

Gli elenchi di elementi sono i file di input per una compilazione. Per la maggior parte dei progetti, ad esempio i progetti .NET SDK, sono disponibili elenchi di elementi predefiniti di diversi tipi di elementi (ad esempio, Compile per i file di origine, Content per determinati file statici e così via) già definiti dalle importazioni standard. Un elenco di questi elementi è disponibile in Elementi comuni del progetto MSBuild. Nel codice del progetto, questi sono predefiniti per includere tutti gli elementi rilevanti; Ad esempio, Compile in un progetto C# include tutti i file con l'estensione .cs .

Per escludere i file, è possibile usare l'attributo Remove sull'elemento.

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

È possibile specificare più file singoli o vari modelli GLOB:

<ItemGroup>
   <Compile Remove="Contoso*.cs" /> <!-- Wildcard on filename -->
   <Compile Remove="File1.cs;File2.cs" /> <!-- List of files with separator -->
   <Compile Remove="Contoso/**/*.cs" /> <!-- All .cs files in a directory subtree -->
</ItemGroup>

Per un elenco dei modelli supportati, vedere Formati dei modelli.

Includere ed escludere file o directory nel linguaggio MSBuild

Nel linguaggio MSBuild non elaborato, ovvero senza alcuna importazione standard o riferimento a un SDK, gli elementi da includere vengono dichiarati separatamente o come gruppo usando l'attributo Include . Ad esempio:

<CSFile Include="Form1.cs"/>
<CSFile Include ="File1.cs;File2.cs"/>
<CSFile Include="*.cs"/>
<JPGFile Include="Images\**\*.jpg"/>

Se si usano caratteri jolly per includere tutti i file in una directory o un set annidato di directory come input per una compilazione, potrebbero essere presenti uno o più file nella directory o in una directory nel set annidato di directory che non si desidera includere. Per escludere un elemento dall'elenco di elementi, usare l'attributo Exclude.

Exclude non è in realtà un'operazione di elemento; non può essere usato da solo, ma solo come modificatore per Include.

Per includere tutti i .cs file o *.vb ad eccezione di Form2

  • Usare uno degli attributi Include e Exclude seguenti:

    <CSFile Include="*.cs" Exclude="Form2.cs"/>
    

    or

    <VBFile Include="*.vb" Exclude="Form2.vb"/>
    

Per includere tutti i .cs file o .vb tranne Form2 e Form3

  • Usare uno degli attributi Include e Exclude seguenti:

    <CSFile Include="*.cs" Exclude="Form2.cs;Form3.cs"/>
    

    or

    <VBFile Include="*.vb" Exclude="Form2.vb;Form3.vb"/>
    

Per includere tutti i .jpg file nelle sottodirectory della Images directory, ad eccezione di quelli nella Version2 directory

  • Usare gli attributi Include e Exclude seguenti:

    <JPGFile
        Include="Images\**\*.jpg"
        Exclude = "Images\**\Version2\*.jpg"/>
    

    Nota

    È necessario specificare il percorso per entrambi gli attributi. Se si usa un percorso assoluto per specificare i percorsi file nell'attributo Include, è necessario usare un percorso assoluto anche nell'attributo Exclude. Se si usa un percorso relativo nell'attributo Include, è necessario usare un percorso relativo anche nell'attributo Exclude.

Escludere e rimuovere

Se si definiscono elenchi di elementi personalizzati, è consigliabile usarli Exclude quando possibile. Esiste un vantaggio per le prestazioni dell'uso Exclude nella stessa dichiarazione di Include, perché gli elementi che verrebbero esclusi non devono essere elaborati.

Usare Remove quando si dispone di un elenco di elementi predefinito, ad esempio nel caso degli elenchi di elementi standard come Compile e Content. In tal caso, Exclude non è supportato.

Nota

Se si usa un SDK che lo supporta, è possibile impostare la $(OverrideDefaultCompileItems) proprietà su truee definire il proprio Compile elemento con Include e, facoltativamente, Exclude.

Usare le condizioni per escludere un file o una directory dagli input per una compilazione

Se sono presenti elementi che si vuole includere, ad esempio, in una build di debug, ma non in una build di versione, è possibile usare l'attributo Condition per specificare le condizioni in cui includere l'elemento.

Per includere il file Formula.vb solo nelle build di versione

  • Usare un attributo Condition simile al seguente:

    <Compile
        Include="Formula.vb"
        Condition=" '$(Configuration)' == 'Release' " />
    

Esempio

L'esempio di codice seguente compila un progetto con tutti i file cs nella directory, tranne Form2.cs.

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

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

    <ItemGroup>
        <CSFile Include="*.cs" Exclude="Form2.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>