Dela via


Exkludera filer från bygget

I en projektfil kan du använda jokertecken för att inkludera alla filer i en katalog eller en kapslad uppsättning kataloger som indata för en version. Det kan dock finnas en fil i katalogen eller en katalog i en kapslad uppsättning kataloger som du inte vill inkludera som indata för en version. Du kan uttryckligen undanta filen eller katalogen från listan med indata. Det kan också finnas en fil i ett projekt som du bara vill inkludera under vissa villkor. Du kan uttryckligen deklarera de villkor under vilka en fil ingår i en version.

Anmärkning

De tekniker som beskrivs i den här artikeln gäller inte för F# och C++. Dessa projektsystem hanterar själva källfilerna.

Exkludera en fil med Visual Studio

Om du använder Visual Studio väljer du filen i Solution Explorer, visar fönstret Egenskaper (tryck på Alt+Retur) och ställer in byggåtgärdenIngen.

Det resulterar i följande ändringar i MSBuild-projektfilen:

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

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

Det fungerar bra för några filer, men skalas inte upp till ett större antal filer eller filer som matchar ett visst mönster. I .NET-projekt kan du använda MSBuild för att exkludera filer och kataloger med ett jokerteckenuttryck, även kallat glob, enligt beskrivningen härnäst.

Exkludera filer eller kataloger i .NET-projekt

Objektlistor är indatafilerna för en version. För de flesta projekt, till exempel .NET SDK-projekt, finns det fördefinierade objektlistor med olika typer av objekt (till exempel Compile för källfiler, Content för vissa statiska filer och så vidare) som redan har definierats av standardimporterna. En lista över dessa objekt finns i Vanliga MSBuild-projektobjekt. I projektkoden är dessa fördefinierade för att inkludera allt relevant. I ett C#-projekt ingår till exempel Compile alla filer med .cs tillägget.

Om du vill exkludera filer kan du använda Remove attributet för objektet.

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

Du kan ange flera enskilda filer eller olika globmönster:

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

En lista över mönster som stöds finns i Mönsterformat.

Inkludera och exkludera filer eller kataloger på MSBuild-språket

På det råa MSBuild-språket (dvs. utan någon standardimport eller referens till ett SDK) deklareras de objekt som du vill inkludera antingen separat eller som en grupp med hjälp av Include attributet. Till exempel:

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

Om du använder jokertecken för att inkludera alla filer i en katalog eller en kapslad uppsättning kataloger som indata för en version kan det finnas en eller flera filer i katalogen eller en katalog i den kapslade uppsättningen kataloger som du inte vill inkludera. Om du vill exkludera ett objekt från objektlistan använder du attributet Exclude .

Exclude är egentligen inte en objektåtgärd. Det kan inte användas av sig själv, utan bara som en modifierare för Include.

Inkludera alla .cs eller .vb filer utom Form2

  • Använd någon av följande Include och Exclude attribut:

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

    eller

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

Inkludera alla .cs eller .vb filer utom Form2 och Form3

  • Använd någon av följande Include och Exclude attribut:

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

    eller

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

Inkludera alla .jpg filer i underkataloger i Images katalogen förutom de i Version2 katalogen

  • Använd följande Include och Exclude attribut:

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

    Anmärkning

    Du måste ange sökvägen för båda attributen. Om du använder en absolut sökväg för att ange filplatser i Include attributet måste du också använda en absolut sökväg i Exclude attributet. Om du använder en relativ sökväg i Include attributet måste du också använda en relativ sökväg i Exclude attributet.

Exkludera och ta bort

Om du definierar dina egna objektlistor bör du använda Exclude när det är möjligt. Det finns en prestandafördel att använda Exclude i samma deklaration som Include, eftersom de objekt som skulle undantas inte behöver bearbetas.

Använd Remove när du har en fördefinierad objektlista, till exempel när det gäller standardobjektlistor som Compile och Content. I så fall Exclude stöds inte.

Anmärkning

Om du använder en SDK som stöder den kan du ange $(OverrideDefaultCompileItems) egenskapen till trueoch definiera ditt eget Compile objekt med Include och, om du vill, Exclude.

Använd villkor för att undanta en fil eller katalog från indata för en build

Om det finns objekt som du vill inkludera, till exempel i en felsökningsversion men inte en versionsversion, kan du använda Condition attributet för att ange under vilka villkor objektet ska inkluderas.

Inkludera endast filen Formula.vb i releaseversioner

  • Använd ett Condition attribut som liknar följande:

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

Exempel

I följande kodexempel skapas ett projekt med alla .cs filer i katalogen förutom Form2.cs.

<Project DefaultTargets="Compile">

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