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


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

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

Примечание.

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

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

Если вы используете Visual Studio, выберите файл в Обозреватель решений, просмотрите окно свойств (нажмите клавиши ALT+ВВОД) и задайте для действия сборки значение 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"/>

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

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

Включение всех .cs или файлов, *.vb кроме Form2

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

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

    or

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

Включение всех или файлов.cs, .vb кроме Form2Form3

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

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

    or

    <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, поддерживающий его, можно задать для свойства trueзначение , а также определить собственный Compile элемент с Include помощью и, при необходимости, Exclude.$(OverrideDefaultCompileItems)

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

Если имеются элементы, которые требуется включить, например, в отладочную сборку, но не в сборку выпуска, можно использовать атрибут 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>