Поделиться через


Исключение файлов из сборки

В файле проекта можно использовать подстановочные знаки для включения всех файлов в один каталог или вложенный набор каталогов в качестве входных данных для сборки. Однако в каталоге может быть один файл или один каталог в вложенном наборе каталогов, которые не нужно включать в качестве входных данных для сборки. Вы можете явно исключить этот файл или каталог из списка входных данных. В проекте также может быть файл, который требуется включить только в определенных условиях. Вы можете явно объявить условия, при которых файл включен в сборку.

Замечание

Описанные в этой статье методы не применимы к F# и C++. Эти системы проектов управляют исходными файлами сами.

Исключение файла с помощью Visual Studio

Если вы используете Visual Studio, выберите файл в обозревателе решений, откройте окно свойств (нажмите Alt++Enter) и установите действие сборки на None.

Это приводит к следующим изменениям в файле проекта MSBuild:

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

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

Это хорошо подходит для нескольких файлов, но не масштабируется до большего числа файлов или файлов, которые соответствуют определенному шаблону. В проектах .NET можно использовать MSBuild для исключения файлов и каталогов с помощью выражения подстановочного знака, также называемого глобом, как описано далее.

Исключение файлов или каталогов в проектах .NET

Списки элементов — это входные файлы для сборки. Для большинства проектов, таких как проекты пакета SDK для .NET, существуют предопределенные списки элементов различных типов элементов (например, Compile для исходных файлов, Content для определенных статических файлов и т. д.), которые уже определены стандартными импортами. Список этих элементов можно найти в элементах проекта Common MSBuild. В коде проекта они предопределяются для включения всего соответствующего; Например, Compile в проекте C# содержатся все файлы с расширением .cs .

Чтобы исключить файлы, можно использовать Remove атрибут элемента.

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

Можно указать несколько отдельных файлов или различные шаблоны глобов:

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

Список поддерживаемых шаблонов см. в разделе "Форматы шаблонов".

Включение и исключение файлов или каталогов на языке MSBuild

В необработанном языке MSBuild (то есть без стандартного импорта или ссылки на пакет SDK) элементы, которые необходимо включить, объявляются отдельно или как группа с помощью атрибута Include . Рассмотрим пример.

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

Если вы используете подстановочные знаки для включения всех файлов в один каталог или вложенный набор каталогов в качестве входных данных для сборки, может быть один или несколько файлов в каталоге или один каталог в вложенном наборе каталогов, которые вы не хотите включить. Чтобы исключить элемент из списка элементов, используйте Exclude атрибут.

Exclude не является операцией элемента; его нельзя использовать самостоятельно, но только в качестве модификатора Include.

Включить все файлы .cs или .vb, за исключением Form2.

  • Используйте один из следующих Include атрибутов и Exclude атрибутов:

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

    или

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

Включить все файлы .cs или .vb, кроме Form2 и Form3

  • Используйте один из следующих Include атрибутов и Exclude атрибутов:

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

    или

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

Включить все файлы .jpg в подкаталоги каталога Images, кроме файлов в каталоге Version2.

  • Используйте следующие Include и Exclude атрибуты:

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

    Замечание

    Необходимо указать путь для обоих атрибутов. Если вы используете абсолютный путь для указания расположений файлов в Include атрибуте, необходимо также использовать абсолютный путь в Exclude атрибуте; если в атрибуте используется относительный путь, необходимо также использовать относительный Include путь в атрибуте Exclude .

Исключение и удаление

Если вы определяете собственные списки элементов, следует использовать Exclude каждый раз, когда это возможно. Использование Exclude в той же декларации, что и Include, имеет преимущество по производительности, так как те элементы, которые будут исключены, не должны обрабатываться.

Используйте Remove при наличии предопределенного списка элементов, например в случае стандартных списков элементов, таких Compile как и Content. В этом случае Exclude не поддерживается.

Замечание

Если вы используете пакет SDK, поддерживающий эту функцию, можно задать для свойства $(OverrideDefaultCompileItems) значение true и определить собственный элемент Compile с помощью Include, и при необходимости, Exclude.

Использование условий для исключения файла или каталога из входных данных для сборки

Если есть элементы, которые необходимо включить, например, в сборку отладки, но не сборку выпуска, можно использовать Condition атрибут для указания условий, в которых следует включить этот элемент.

Включить файл Formula.vb только в релизные сборки

  • Используйте атрибут, аналогичный Condition следующему:

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

Пример

В следующем примере кода создается проект со всеми файлами .cs в каталоге, кроме 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>