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 **/*.cs
GLOB , 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>