Auswählen von Dateien für den Buildvorgang

In den meisten Projekten müssen Sie die zu erstellenden Dateien nicht explizit auswählen. So werden beispielsweise bei jedem mit Visual Studio erstellten Projekt alle Quelldateien im Projekt erstellt. Möglicherweise müssen Sie jedoch wissen, wie Sie Ihre Projektdatei so bearbeiten, dass Sie mit Szenarien umgehen können, die vom Standard abweichen. Zum Beispiel, wenn Sie Dateien von Speicherorten außerhalb der Projektordner erstellen möchten, oder wenn Sie Ihren eigenen Build-Prozess erstellen, anstatt SDKs wie .NET SDK zu verwenden.

Standardverhalten nach Projekttyp

Das Standardverhalten, das bestimmt, welche Dateien MSBuild in den Build einbezieht, unterscheidet sich je nach Projekttyp.

Bei .NET SDK-Projekten definiert das standardmäßige .NET SDK eine StandardelementlisteCompile, die Dateien im Projektordnerbaum beinhaltet, die der entsprechenden sprachspezifischen Dateierweiterung entsprechen. Bei einem C#-Projekt wird das Compile-Element beispielsweise mit dem Globmuster **/*.cs aufgefüllt, das sämtlichen Quelldateien im Projektordner und all seinen 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-Projekt SDK-Übersicht – Standardein- und -ausschlüsse.

Wenn Sie Visual Studio verwenden, können Sie die zu erstellenden Quelldateien ändern, indem Sie die Build-Aktion für eine Datei ändern. Legen Sie sie auf None fest, um eine Datei aus dem Build auszuschließen. Wenn Sie dies in Visual Studio tun, wirkt sich dies auf die Projektdatei aus. Sie werden sehen, dass Zeilen hinzugefügt wurden, um die Quelldatei aus der Compile-Artikelliste zu entfernen und der None-Artikelliste hinzuzufügen.

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

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

Bei .NET Framework oder anderen Nicht-SDK-Projekten wird das Element Compile 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 von Hand erstellen, ohne ein SDK zu verwenden, können Sie jede Quelldatei einzeln in der Projektdatei auflisten. Alternativ können Sie Platzhalter nutzen, um alle Dateien in ein Verzeichnis oder in einen geschachtelten Satz von Verzeichnissen einzufügen. Sie können die in diesem Artikel erläuterten Methoden auch dazu verwenden, um die Compile-Elementliste (bei .NET-Projekten) oder die ClCompile-Elementliste bei C++-Projekten zu ändern, um individuell festzulegen, welche Dateien erstellt werden sollen.

Angeben von Eingaben

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

Damit Dateien für einen Build eingeschlossen werden können, müssen sie in einer Elementliste (Artikelliste) aufgeführt sein. Wie bereits erwähnt, ist Compile bei .NET SDK- und .NET Framework-Projekten die Elementliste für die Quelldateien. Bei .NET SDK-Projekten wird die Elementliste Compile nicht angezeigt, da sie in den impliziten Importen definiert ist. Weitere Informationen finden Sie unter Nutzung von Projekt-SDKs .

Projektdateien, die sich nicht auf die Standardimporte stützen, können einen beliebigen Elementlistennamen verwenden, wie etwa VBFile oder CSFile. Siehe Beispiel 1 und Beispiel 2 weiter unten in diesem Artikel. Um einen Build auf der Grundlage der Elementliste (Artikelliste) einzurichten, übergeben Sie diese namentlich an eine Build-Aufgabe, wie später in diesem Artikel beschrieben.

Es können mehrere Dateien einer Elementliste hinzugefügt werden, indem die Dateien entweder einzeln oder mithilfe von Platzhaltern eingefügt werden, mit denen viele Dateien gleichzeitig eingefügt werden können.

So deklarieren Sie Elemente einzeln

  • Verwenden Sie die Include-Attribute, ähnlich wie folgt:

    <Compile Include="Form1.cs"/>

    oder

    <Compile Include="Form1.vb"/>

    Hinweis

    Wenn sich Elemente in einer Elementauflistung nicht im gleichen Verzeichnis wie die Projektdatei befinden, müssen Sie den vollständigen oder relativen Pfad des Elements angeben. Beispiel: Include="..\..\Form2.cs"

Dieselbe Elementliste (Artikelliste) kann von mehreren Include-Attributen mehrfach geändert werden. Jedes Include wird den vorherigen hinzugefügt.

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

Angeben von Eingaben mit Platzhaltern

Sie können auch Platzhalter verwenden, um rekursiv alle Dateien oder nur bestimmte Dateien aus Unterverzeichnissen als Eingaben für einen Build einzufügen. Weitere Informationen zu Elementen finden Sie unter Items (Elemente).

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

Project\Images\BestJpgs

Project\Images\ImgJpgs

Project\Images\ImgJpgs\Img1

So schließen Sie alle JPG-Dateien im Verzeichnis Images bzw. in Unterverzeichnissen 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 schließen Sie alle Dateien in Verzeichnissen ein, die mit jpgs enden

  • Ändern 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, abgesehen von einigen Ausnahmen, einem bestimmten Muster entsprechen. Sie können dies in einem einzelnen Vorgang mit einer Kombination von Include und Exclude durchführen.

<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 von einem SDK einbezogen wurde, können Sie das Remove-Attribut verwenden.

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

Elemente an eine Aufgabe oder ein Ziel übergeben

Für die meisten Projektdateien müssen Sie das Compile-Element nicht explizit an ein Ziel oder eine Aufgabe übergeben, da dies durch die Standardimporte erledigt wird. Im Fall einer Zielprojektdatei können Sie jedoch die @()-Notation für Aufgaben verwenden, um eine gesamte Elementliste (Artikelliste) als Eingabe für einen Build festzulegen. Sie können diese Notation verwenden, egal ob Sie alle Dateien einzeln auflisten oder Platzhalter verwenden.

So verwenden Sie alle C#- oder Visual Basic-Dateien als Eingabe für eine Compiler-Aufgabe

  • Verwenden Sie die Include-Attribute ähnlich wie folgt:

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

    oder

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

Hinweis

Sie müssen Platzhalter mit Elementen verwenden, um die Eingaben für einen Build anzugeben. Sie können keine Eingaben mithilfe des Sources-Attributs in MSBuild-Aufgaben verwenden, wie z. B. Ccs oder Vbc. Das folgende Beispiel ist in einer Projektdatei nicht gültig:

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

Beispiel 1

Das folgende Codebeispiel zeigt ein Projekt, das alle Eingabedateien separat einschließt.

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

Beispiel 2

Das folgende Codebeispiel verwendet einen Platzhalter, um alle CS-Dateien einzuschließen.

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