Freigeben über


Auswählen von Dateien für den Buildvorgang

In den meisten Projekten müssen Sie die zu erstellenden Dateien nicht explizit auswählen. Beispielsweise erstellt jedes mit Visual Studio erstellte Projekt alle Quelldateien im Projekt. Möglicherweise müssen Sie jedoch wissen, wie Sie Ihre Projektdatei bearbeiten können, um Szenarien zu verarbeiten, die sich von der Standardeinstellung unterscheiden, z. B. wenn Sie Dateien von anderen Speicherorten außerhalb der Projektordner erstellen möchten, oder wenn Sie ihren eigenen Buildprozess erstellen, anstatt ein SDK wie das .NET SDK zu verwenden.

Standardverhalten nach Projekttyp

Das Standardverhalten, das bestimmt, welche Dateien MSBuild im Build enthält, unterscheidet sich je nach Projekttyp.

Für .NET SDK-Projekte definiert das .NET-Standard-SDK eine Standardelementliste Compile , die Dateien in der Projektordnerstruktur enthält, die mit der entsprechenden sprachspezifischen Dateierweiterung übereinstimmen. Bei einem C#-Projekt wird das Compile Element beispielsweise mit dem Glob-Muster **/*.csaufgefüllt, das allen Quelldateien im Projektordner und allen unterordnern rekursiv entspricht. Das Compile Element in der Projektdatei wird nicht angezeigt, da es in der SDK-Datei .props definiert ist, die implizit importiert wird. Siehe .NET Project SDK-Übersicht – Standardeinschluss und -ausschluss.

Wenn Sie Visual Studio verwenden, können Sie die zu erstellenden Quelldateien ändern, indem Sie die Buildaktion für eine Datei ändern. Setzen Sie None, um eine Datei vom Build auszuschließen. Die Änderung in Visual Studio wirkt sich auf die Projektdatei aus. Visual Studio fügt Zeilen hinzu, um die Quelldatei aus der Compile Elementliste zu entfernen und der None Elementliste hinzuzufügen.

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

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

Für .NET Framework oder andere Nicht-SDK-Projekte wird das Compile Element explizit in der Projektdatei erstellt, indem alle Quelldateien aufgelistet werden.

Bei C++-Projekten werden Quelldateien explizit dem ClCompile Element in der Projektdatei hinzugefügt.

Wenn Sie eine MSBuild-Projektdatei ohne VERWENDUNG eines SDK manuell erstellen, können Sie jede Quelldatei separat in der Projektdatei auflisten, oder Sie können Mit Wildcards alle Dateien in einem Verzeichnis oder einer geschachtelten Gruppe von Verzeichnissen einschließen. Sie können auch die Techniken in diesem Artikel verwenden, um die Compile Elementliste (in .NET-Projekten) oder ClCompile die Elementliste in C++-Projekten zu ändern, um anzupassen, welche Dateien erstellt werden.

Eingaben angeben

Elemente stellen die Eingaben (z. B. Quelldateien) für einen Build dar. Weitere Informationen zu Elementen finden Sie unter Items.

Um Dateien für einen Build einzuschließen, müssen sie in einer Elementliste enthalten sein. Wie bereits erwähnt, ist Compilein .NET SDK- und .NET Framework-Projekten die Elementliste für die Quelldateien. Die Compile Elementliste wird in .NET SDK-Projekten nicht angezeigt, da sie in den impliziten Importen definiert ist. Siehe Verwenden von Projekt-SDKs.

Projektdateien, die nicht auf die Standardimporte angewiesen sind, können einen beliebigen Elementlistennamen verwenden, z. B. VBFile oder CSFile. Weitere Informationen finden Sie weiter unten in diesem Artikel in Beispiel 1 und Beispiel 2 . Um einen Build basierend auf der Elementliste einzurichten, übergeben Sie die Elementliste anhand des Namens an eine Buildaufgabe, wie weiter unten in diesem Artikel erläutert.

Mehrere Dateien können zu Elementlisten hinzugefügt werden, indem sie entweder einzeln hinzugefügt oder durch Wildcards viele Dateien auf einmal einbezogen werden.

So deklarieren Sie Elemente einzeln

  • Verwenden Sie die Include attribute ähnlich wie folgt:

    <Compile Include="Form1.cs"/>

    oder

    <Compile Include="Form1.vb"/>

    Hinweis

    Wenn Elemente in einer Elementsammlung nicht im selben Verzeichnis wie die Projektdatei enthalten sind, müssen Sie den vollständigen oder relativen Pfad zum Element angeben. Beispiel: Include="..\..\Form2.cs".

Dieselbe Elementliste kann von mehreren Include Attributen wiederholt geändert werden. Jedes Include addiert zu dem, was zuvor dort war.

So deklarieren Sie mehrere Elemente

  • Verwenden Sie die Include attribute ähnlich wie folgt:

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

    oder

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

Eingaben mit Wildcards angeben

Sie können auch Wildcards verwenden, um alle Dateien oder nur bestimmte Dateien aus Unterverzeichnissen als Eingaben für einen Build rekursiv einzuschließen. Weitere Informationen zu Wildcards finden Sie unter Items

Die folgenden Beispiele basieren auf einem Projekt, das Grafikdateien in den folgenden Verzeichnissen und Unterverzeichnissen enthält, wobei sich die Projektdatei im Projektverzeichnis befindet:

Project\Images\BestJpgs

Project\Images\ImgJpgs

Project\Images\ImgJpgs\Img1

So fügen Sie alle .jpg Dateien in das Verzeichnis "Images " und Unterverzeichnisse ein

  • Verwenden Sie das folgende Include Attribut:

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

So schließen Sie alle .jpg Dateien ein, die mit img beginnen

  • Verwenden Sie das folgende Include Attribut:

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

So fügen Sie alle Dateien in Verzeichnisse mit Namen ein, die auf jpgs enden

  • Verwenden Sie eines der folgenden Include Attribute:

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

    oder

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

Ausschließen und Entfernen von Elementen

Möglicherweise möchten Sie Dateien angeben, die einem bestimmten Muster entsprechen, mit einigen Ausnahmen. Sie können dies in einem einzelnen Vorgang mit einer Kombination von Include und Exclude.

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

Um ein Element zu entfernen, das zuvor enthalten war oder standardmäßig in einem SDK enthalten war, können Sie das Remove Attribut verwenden.

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

Übergeben von Elementen an eine Aufgabe oder ein Ziel

In den meisten Projektdateien müssen Sie das Compile Element nicht explizit an ein Ziel oder eine Aufgabe übergeben, da dies von den Standardimporten verarbeitet wird. Im Fall einer Zielprojektdatei können Sie jedoch die @() Schreibweise in Aufgaben verwenden, um eine gesamte Elementenliste als Eingabe für einen Build anzugeben. Sie können diese Notation verwenden, unabhängig davon, ob Sie alle Dateien separat auflisten oder Platzhalter verwenden.

So verwenden Sie alle C#- oder Visual Basic-Dateien als Eingaben für eine Compileraufgabe

  • Verwenden Sie die Include Attribute ähnlich wie die folgenden:

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

    oder

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

Hinweis

Sie müssen mit Platzhaltern (Wildcards) und Elementen die Eingaben für einen Build angeben; Sie können die Eingaben nicht mithilfe des Sources-Attributs in MSBuild-Aufgaben wie Csc oder Vbc angeben. Das folgende Beispiel ist in einer Projektdatei ungültig:

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

Beispiel 1

Das folgende Codebeispiel zeigt ein Projekt, das alle Eingabedateien separat enthält.

<Project DefaultTargets="Compile">
    <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>

Beispiel 2

Im folgenden Codebeispiel wird ein Wildcard verwendet, um alle .cs Dateien einzuschließen.

<Project DefaultTargets="Compile">

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