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


Выбор файлов для сборки

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

Поведение по умолчанию по типу проекта

Поведение по умолчанию, определяющее, какие файлы MSBuild включает в сборку, зависит от типа проекта.

Для проектов пакета SDK для .NET стандартный пакет SDK для .NET определяет список элементов по умолчанию, содержащий файлы в дереве папок проекта, соответствующий соответствующему расширению Compile файла для конкретного языка. Например, для проекта C# элемент Compile заполняется шаблоном глобов **/*.cs, который соответствует всем исходным файлам в папке проекта и ее вложенные папки рекурсивно. Вы не видите элемент Compile в файле проекта, поскольку он определён в файле SDK .props, который импортируется неявно. Обзор пакета SDK для проектов .NET - включения и исключения по умолчанию.

Если вы используете Visual Studio, можно изменить набор исходных файлов для сборки, изменив действие сборки в файле. Установите значение None, чтобы исключить файл из сборки. Это изменение в Visual Studio влияет на файл проекта. Visual Studio добавляет строки, чтобы удалить исходный файл из Compile списка элементов и добавить его в None список элементов.

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

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

Для .NET Framework или других проектов, отличных от пакета SDK, Compile элемент создается явным образом в файле проекта, перечисляя все исходные файлы.

Для проектов C++ исходные файлы явно добавляются в ClCompile элемент в файле проекта.

Когда вы вручную создаете файл проекта MSBuild без использования пакета SDK, вы можете перечислить каждый исходный файл отдельно в файле проекта или использовать подстановочные знаки для включения всех файлов в один каталог или вложенный набор каталогов. Вы также можете использовать методы, описанные в этой статье, для изменения Compile списка элементов (в проектах .NET) или ClCompile списка элементов в проектах C++ для настройки созданных файлов.

Указание входных данных

Элементы представляют входные данные (например, исходные файлы) для сборки. Дополнительные сведения о элементах см. в разделе "Элементы".

Чтобы включить файлы для сборки, их необходимо включить в список элементов. Как упоминалось ранее, в проектах SDK для .NET и .NET Framework список элементов для исходных файлов — это Compile. Список элементов Compile не отображается в проектах SDK для .NET, так как он определен в неявных импортируемых библиотеках. См. раздел "Использование пакетов SDK для проекта".

Файлы проекта, которые не полагаются на стандартные импорты, могут использовать произвольное имя списка элементов, например VBFile или CSFile. См. пример 1 и пример 2 далее в этой статье. Чтобы настроить сборку на основе списка элементов, передайте список элементов по имени задаче сборки, как описано далее в этой статье.

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

Объявление элементов по отдельности

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

    <Compile Include="Form1.cs"/>

    или

    <Compile Include="Form1.vb"/>

    Замечание

    Если элементы в коллекции элементов не в том же каталоге, что и файл проекта, необходимо указать полный или относительный путь к элементу. Например: Include="..\..\Form2.cs".

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

Объявление нескольких элементов

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

    <Compile Include="Form1.cs;Form2.cs"/>

    или

    <Compile Include="Form1.vb;Form2.vb"/>

Задать входные данные с подстановочными знаками

Можно также использовать подстановочные знаки для рекурсивного включения всех файлов или только определенных файлов из подкаталогов в качестве входных данных для сборки. Дополнительные сведения о подстановочных знаках см. в разделе "Элементы"

Следующие примеры основаны на проекте, содержащем графические файлы в следующих каталогах и подкаталогах, с файлом проекта, расположенным в каталоге Project :

Project\Images\BestJpgs

Project\Images\ImgJpgs

Project\Images\ImgJpgs\Img1

Включение всех .jpg файлов в каталог изображений и подкаталогов

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

    Include="Images\**\*.jpg"

Для включения всех файлов .jpg, начинающихся с img

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

    Include="Images\**\img*.jpg"

Включить все файлы в каталоги с именами, заканчивающимися на jpgs

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

    Include="Images\**\*jpgs\*.*"

    или

    Include="Images\**\*jpgs\*"

Исключение и удаление элементов

Может потребоваться указать файлы, соответствующие определенному шаблону, с некоторыми исключениями. Это можно сделать в одной операции с помощью сочетания Include и Exclude.

<ItemGroup>
  <!-- Include every C# source file, except anything in the "sub" folder -->
  <Compile Include="**/*.cs" Exclude="sub/**/*.cs">
</ItemGroup>

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

<ItemGroup>
  <!-- Remove anything in the "sub" folder -->
  <Compile Remove="sub/**/*.cs">
</ItemGroup>

Передача элементов в задачу или целевой объект

В большинстве файлов проекта не нужно явно передавать Compile элемент целевому объекту или задаче, так как это обрабатывается стандартным импортом. Но в случае целевого файла проекта можно использовать @() нотацию в задачах, чтобы указать весь список элементов в качестве входных данных для сборки. Эту нотацию можно использовать независимо от того, перечисляются ли все файлы отдельно или используются подстановочные знаки.

Использование всех файлов C# или Visual Basic в качестве входных данных для задачи компилятора

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

    <CSC Sources="@(CSFile)">...</CSC>

    или

    <VBC Sources="@(VBFile)">...</VBC>

Замечание

С элементами необходимо использовать подстановочные знаки, чтобы указать входные параметры для сборки; входные параметры нельзя указать с помощью атрибута Sources в задачах MSBuild, таких как Csc или Vbc. Следующий пример недействителен в файле проекта:

<CSC Sources="*.cs">...</CSC>

Пример 1

В следующем примере кода показан проект, включающий все входные файлы отдельно.

<Project DefaultTargets="Compile">
    <PropertyGroup>
        <Builtdir>built</Builtdir>
    </PropertyGroup>

    <ItemGroup>
        <CSFile Include="Form1.cs"/>
        <CSFile Include="AssemblyInfo.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>

Пример 2

В следующем примере кода используется подстановочный знак для включения всех .cs файлов.

<Project DefaultTargets="Compile">

    <PropertyGroup>
        <builtdir>built</builtdir>
    </PropertyGroup>

    <ItemGroup>
        <CSFile Include="*.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>