Ausschließen von Dateien aus dem Buildvorgang

Sie können in einer Projektdatei Platzhalter verwenden, um alle Dateien in einem Verzeichnis oder einer geschachtelten Gruppe von Verzeichnissen als Eingaben für einen Buildvorgang einzuschließen. Möglicherweise gibt es jedoch eine Datei im Verzeichnis oder ein Verzeichnis in einer geschachtelten Gruppe von Verzeichnissen, die nicht als Eingabe für einen Buildvorgang eingeschlossen werden sollen. Sie können diese Datei oder dieses Verzeichnis explizit aus der Liste der Eingaben ausschließen. Vielleicht gibt es auch eine Datei in einem Projekt, das Sie nur unter bestimmten Umständen miteinbeziehen wollen. Sie können die Bedingungen explizit deklarieren, unter denen eine Datei in einem Buildvorgang enthalten ist.

Hinweis

Die in diesem Artikel beschriebenen Verfahren gelten nicht für F# und C++. Diese Projektsysteme verwalten die Quelldateien selbst.

Ausschließen einer Datei mit Visual Studio

Wählen Sie bei Nutzung von Visual Studio die Datei im Projektmappen-Explorer aus, zeigen Sie das Fenster Eigenschaften an (drücken Sie ALT+EINGABETASTE), und stellen Sie die Buildaktion auf Keine ein.

Das führt in der Projektdatei von MSBuild zu den folgenden Änderungen:

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

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

Dies funktioniert gut für einige wenige Dateien, lässt sich aber nicht auf eine größere Anzahl von Dateien hochskalieren oder für Dateien anwenden, die einem bestimmten Muster entsprechen. In .NET-Projekten können Sie mithilfe von MSBuild Dateien und Verzeichnisse mit einem Platzhalterausdruck (auch als Glob bezeichnet) ausschließen, wie im nächsten Schritt beschrieben.

Ausschließen von Dateien oder Verzeichnissen in .NET-Projekten

Elementlisten sind die Eingabedateien für einen Buildvorgang. Für die meisten Projekte, wie etwa .NET SDK-Projekte, gibt es vordefinierte Elementlisten verschiedener Elementtypen (z. B. Compile für Quelldateien, Content für bestimmte statische Dateien usw.), die bereits durch die Standardimporte definiert sind. Eine Liste dieser Elemente finden Sie unter Gemeinsame MSBuild-Projektelemente. Im Projektcode sind diese vordefiniert, um alle relevanten Elemente einzubeziehen. Compile in einem C#-Projekt zum Beispiel enthält alle Dateien mit der Erweiterung .cs.

Mit dem Attribut Remove für das jeweilige Element können Sie Dateien ausschließen.

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

Sie können mehrere Einzeldateien oder verschiedene Globmuster angeben:

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

Eine Liste der unterstützten Muster finden Sie unter Musterformate.

Ein- und Ausschließen von Dateien oder Verzeichnissen in der Sprache MSBuild

In der unformatierten MSBuild-Sprache (d. h. ohne Standardimporte oder Verweis auf ein SDK) werden die einzubeziehenden Elemente entweder separat oder als Gruppe mit dem Attribut Include deklariert. Zum Beispiel:

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

Wenn Sie Platzhalter verwenden, um alle Dateien in einem Verzeichnis oder einer geschachtelten Gruppe von Verzeichnissen als Eingaben für einen Buildvorgang einzuschließen, gibt es möglicherweise eine oder mehrere Dateien im Verzeichnis oder ein Verzeichnis in einer geschachtelten Gruppe von Verzeichnissen, die Sie nicht einschließen möchten. So verwenden Sie das Attribut Exclude zum Ausschließen eines Elements aus der Elementliste.

Exclude ist eigentlich kein Elementvorgang; das Attribut kann nicht allein verwendet werden, sondern nur als Modifizierer für Include.

So schließen Sie alle .cs- oder *.vb-Dateien außer Form2 ein

  • Ändern Sie eines der folgenden Attribute Include und Exclude:

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

    oder

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

So schließen Sie alle .cs- oder .vb-Dateien außer Form2 und Form3 ein

  • Ändern Sie eines der folgenden Attribute Include und Exclude:

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

    oder

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

So schließen Sie alle .jpg-Dateien in Unterverzeichnisse des Verzeichnisses Images ein, außer den Dateien im Verzeichnis Version2

  • Verwenden Sie die folgenden Attribute Include und Exclude:

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

    Hinweis

    Sie müssen den Pfad für beide Attribute angeben. Wenn Sie einen absoluten Pfad zum Angeben von Dateispeicherorten im Attribut Include verwenden, müssen Sie auch einen absoluten Pfad im Attribut Exclude verwenden. Verwenden Sie einen relativen Pfad im Attribut Include, müssen Sie auch einen relativen Pfad im Attribut Exclude verwenden.

Ausschließen und Entfernen

Beim Definieren eigener Elementlisten sollten Sie nach Möglichkeit Exclude verwenden. Die Nutzung von Exclude in derselben Deklaration wie Include bietet einen Leistungsvorteil, da die ausgeschlossenen Elemente nicht verarbeitet werden müssen.

Verwenden Sie Remove, wenn eine vordefinierte Elementliste vorliegt, zum Beispiel bei den Standardelementlisten wie Compile und Content. In diesem Fall wird Exclude nicht unterstützt.

Hinweis

Wenn Sie ein SDK verwenden, das das Attribut unterstützt, können Sie die Eigenschaft $(OverrideDefaultCompileItems) auf true einstellen und Ihr eigenes Compile-Element mit Include und optional mit Exclude definieren.

Verwenden von Bedingungen zum Ausschließen einer Datei oder eines Verzeichnisses aus den Eingaben für einen Buildvorgang

Wenn es Elemente gibt, die Sie einschließen möchten, z.B. in einem Debugebuild, aber nicht in einem Releasebuild, können Sie das Element Condition verwenden, um die Bedingungen anzugeben, unter denen Sie das Element einschließen möchten.

So schließen Sie die Formula.vb-Datei nur in Releasebuilds ein

  • Verwenden Sie Attribut Condition, das ähnlich des Folgenden ist:

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

Beispiel

Das folgende Codebeispiel erstellt ein Projekt mit allen CS-Dateien im Verzeichnis, außer 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>