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


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

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

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

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

Для проектов пакета SDK для .NET стандартный пакет SDK для .NET определяет список элементов по умолчанию, содержащий файлы в дереве папок проекта, соответствующий соответствующему расширениюCompile файла для конкретного языка. Например, для проекта C# элемент заполняется шаблоном **/*.csглобов, который соответствует всем исходным файлам в папке проекта Compile и все ее вложенные папки рекурсивно. Элемент в файле проекта не отображается Compile , так как он определен в файле ПАКЕТА SDK .props , импортируемом неявно. Общие сведения о пакете SDK для проектов .NET см. в разделе "Пакет SDK для проектов . По умолчанию включает и исключает".

Если вы используете Visual Studio, можно изменить набор исходных файлов для сборки, изменив действие сборки в файле. Задайте для него значение, чтобы исключить None файл из сборки. Это в 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"/>

    or

    <Compile Include="Form1.vb"/>

    Примечание.

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

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

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

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

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

    or

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

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

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

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

Project\Images\BestJpgs

Project\Images\ImgJpgs

Project\Images\ImgJpgs\Img1

Включение всех JPG-файлов в каталоге Images и подкаталогах

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

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

Включение всех JPG-файлов, начинающихся со слога img

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

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

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

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

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

    or

    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>

    or

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

Примечание.

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

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

Пример 1

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

<Project DefaultTargets="Compile"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
    <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"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >

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