Udostępnij za pośrednictwem


Wykluczanie plików z kompilacji

W pliku projektu można użyć symboli wieloznacznych, aby uwzględnić wszystkie pliki w jednym katalogu lub zagnieżdżony zestaw katalogów jako dane wejściowe dla kompilacji. Może jednak istnieć jeden plik w katalogu lub jeden katalog w zagnieżdżonym zestawie katalogów, które nie mają być uwzględniane jako dane wejściowe dla kompilacji. Możesz jawnie wykluczyć ten plik lub katalog z listy danych wejściowych. W projekcie może być również plik, który ma zostać uwzględniny tylko w określonych warunkach. Możesz jawnie zadeklarować warunki, w których plik jest uwzględniony w kompilacji.

Uwaga

Techniki opisane w tym artykule nie mają zastosowania do języków F# i C++. Te systemy projektów zarządzają samymi plikami źródłowymi.

Wykluczanie pliku przy użyciu programu Visual Studio

Jeśli używasz programu Visual Studio, wybierz plik w Eksplorator rozwiązań, wyświetl okno Właściwości (naciśnij klawisz Alt+Enter) i ustaw akcję kompilacji na Brak.

Spowoduje to następujące zmiany w pliku projektu MSBuild:

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

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

Działa to dobrze w przypadku kilku plików, ale nie jest skalowane w górę do większej liczby plików ani plików, które pasują do określonego wzorca. W projektach platformy .NET można używać programu MSBuild do wykluczania plików i katalogów przy użyciu wyrażenia wieloznakowego, nazywanego również symbolem wieloznacznymi, zgodnie z opisem w dalszej części.

Wykluczanie plików lub katalogów w projektach platformy .NET

Listy elementów to pliki wejściowe kompilacji. W przypadku większości projektów, takich jak projekty zestawu .NET SDK, istnieją wstępnie zdefiniowane listy elementów różnych typów elementów (na przykład Compile dla plików źródłowych, Content dla niektórych plików statycznych itd.), które są już zdefiniowane przez standardowe importy. Listę tych elementów można znaleźć w artykule Typowe elementy projektu MSBuild. W kodzie projektu są one wstępnie zdefiniowane, aby uwzględnić wszystkie istotne elementy; na przykład Compile w projekcie języka C# zawiera wszystkie pliki z .cs rozszerzeniem .

Aby wykluczyć pliki, możesz użyć atrybutu Remove w elemencie .

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

Można określić wiele pojedynczych plików lub różne wzorce globu:

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

Aby uzyskać listę obsługiwanych wzorców, zobacz Formaty wzorców.

Dołączanie i wykluczanie plików lub katalogów w języku MSBuild

W nieprzetworzonym języku MSBuild (czyli bez żadnego ze standardowych importów lub odwołania do zestawu SDK) elementy, które mają zostać dołączone, są deklarowane oddzielnie lub jako grupa przy użyciu atrybutu Include . Na przykład:

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

Jeśli używasz symboli wieloznacznych do uwzględnienia wszystkich plików w jednym katalogu lub zagnieżdżonego zestawu katalogów jako danych wejściowych dla kompilacji, może istnieć co najmniej jeden plik w katalogu lub jeden katalog w zagnieżdżonym zestawie katalogów, które nie chcesz uwzględniać. Aby wykluczyć element z listy elementów, użyj atrybutu Exclude .

Exclude nie jest operacją elementu; nie może być używany przez siebie, ale tylko jako modyfikator dla programu Include.

Aby dołączyć wszystkie .cs pliki lub *.vb z wyjątkiem Form2

  • Użyj jednego z następujących Include atrybutów i Exclude :

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

    lub

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

Aby uwzględnić wszystkie .cs pliki lub .vb z wyjątkiem Form2 i Form3

  • Użyj jednego z następujących Include atrybutów i Exclude :

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

    lub

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

Aby uwzględnić wszystkie .jpg pliki w podkatalogach katalogu z Images wyjątkiem tych w Version2 katalogu

  • Użyj następujących Include atrybutów i Exclude :

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

    Uwaga

    Należy określić ścieżkę dla obu atrybutów. Jeśli używasz ścieżki bezwzględnej do określania lokalizacji plików w atrybucie Include , musisz również użyć ścieżki bezwzględnej w Exclude atrybucie. Jeśli używasz ścieżki względnej w atrybucie Include , musisz również użyć ścieżki względnej w atrybucie Exclude .

Wykluczanie i usuwanie

Jeśli definiujesz własne listy elementów, należy użyć Exclude zawsze, gdy jest to możliwe. Istnieje korzyść z wydajności użycia Exclude w tej samej deklaracji co Include, ponieważ elementy, które zostałyby wykluczone, nie muszą być przetwarzane.

Użyj Remove polecenia , jeśli masz wstępnie zdefiniowaną listę elementów, na przykład w przypadku standardowych list elementów, takich jak Compile i Content. W takim przypadku Exclude nie jest obsługiwane.

Uwaga

Jeśli używasz zestawu SDK, który go obsługuje, możesz ustawić $(OverrideDefaultCompileItems) właściwość na true, i zdefiniować własny Compile element za pomocą Include polecenia i, opcjonalnie, Exclude.

Użyj warunków, aby wykluczyć plik lub katalog z danych wejściowych kompilacji

Jeśli istnieją elementy, które chcesz uwzględnić, na przykład w kompilacji debugowania, ale nie kompilacji wydania, możesz użyć atrybutu Condition , aby określić warunki, w których ma zostać uwzględniny element.

Aby dołączyć plik Formula.vb tylko w kompilacjach wydania

  • Użyj atrybutu Condition podobnego do następującego:

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

Przykład

Poniższy przykład kodu tworzy projekt ze wszystkimi plikami .cs w katalogu z wyjątkiem 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>