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


Добавочные сборки MSBuild для новых или устаревших целевых объектов

При создании большого проекта важно, чтобы встроенные целевые объекты, которые по-прежнему up-to-date не перестраиваются. Если все целевые объекты создаются каждый раз, каждая сборка может занять много времени.

В инкрементальной сборке собираются только не собранные цели проекта или устаревшие цели. Модуль сборки Microsoft (MSBuild) сравнивает метки времени входных файлов с метками времени выходных файлов. MSBuild определяет, следует ли пропускать, создавать или частично перестраивать каждый целевой объект.

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

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

MSBuild может создавать целевой объект постепенно, если входные и выходные данные в целевом объекте указаны в файле проекта. Вы указываете значения с помощью атрибутов Inputs и Outputs элемента Target.

В следующем примере указывается список элементов @(CSFile) для Inputs и файла hello.exe для Outputs цели.

<Target Name="Build"
    Inputs="@(CSFile)"
    Outputs="hello.exe">
    ...
</Target>

MSBuild сравнивает метки времени входных данных и выходные данные целевого объекта. В примере, если любой файл в @(CSFile) списке элементов является более новым, чем файл hello.exe , MSBuild создает целевой объект. В противном случае целевой объект пропускается:

<Target Name="Build"
    Inputs="@(CSFile)"
    Outputs="hello.exe">

    <Csc
        Sources="@(CSFile)"
        OutputAssembly="hello.exe"/>
</Target>

Сравнение сопоставления "один к одному" и "без прямого сопоставления"

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

Ниже приведены некоторые соображения о сопоставлении "один к одному" в отличие от отсутствия прямого соответствия:

  • Целевой объект без прямого сопоставления входных и выходных данных всегда строится чаще, чем целевой объект, в котором каждый выход сопоставляется с одним входным вводом. Если целевой объект не имеет прямого сопоставления, MSBuild не может определить конкретные выходные данные для перестроения при изменении только некоторых входных данных.

  • Задачи, которые могут определить прямое сопоставление между выходными данными и входными данными, наиболее подходят для добавочных сборок. Примером является задача LC, которая создает .license файл.

  • Задачи, которые создают одну выходную сборку из нескольких входных данных, не подходят для добавочных сборок. Примерами являются задача Csc , которая упаковывает файлcsc.exe и создает исполняемые файлы, библиотеки и модули, а также задачу Vbc , которая упаковывает файлvbc.exe .

Использование преобразований для создания сопоставления "один к одному"

В следующем примере определяется проект, который создает файлы содержимого для системы справки. Проект работает, преобразуя исходные файлы .txt в промежуточные .content файлы, которые объединяются с XML-файлами метаданных для создания окончательного файла справки, используемого системой. Проект включает следующие задачи:

  • GenerateContentFiles: преобразует .txt файлы в .content файлы.
  • BuildHelp: объединяет файлы содержимого и XML-метаданные для создания окончательного файла справки .

Проект использует преобразования для создания сопоставления "один к одному" между входными и выходными данными в GenerateContentFiles задаче. Элемент Output настраивается таким образом, чтобы автоматически использовать выходные данные задачи GenerateContentFiles в качестве входных данных для задачи BuildHelp.

Файл проекта содержит Convert и Build целевые объекты. Задачи GenerateContentFiles и BuildHelp размещаются в целях Convert и Build соответственно, чтобы каждая цель могла создаваться постепенно. Определение Output элемента помещает выходные данные GenerateContentFiles задачи в ContentFile список элементов для использования в качестве входных данных для BuildHelp задачи. Этот подход автоматически предоставляет выходные данные одной задачи в качестве входных данных для другой задачи. Вам не нужно указывать отдельные элементы или списки элементов вручную в каждой задаче.

Замечание

Хотя целевой Convert объект может создаваться постепенно, все выходные данные из этого целевого объекта всегда требуются в качестве входных данных для целевого Build объекта. MSBuild автоматически предоставляет все выходные данные одной цели в качестве входных данных для другой цели при использовании элемента Output.

<Project DefaultTargets="Build">

    <ItemGroup>
        <TXTFile Include="*.txt"/>
        <XMLFiles Include="\metadata\*.xml"/>
    </ItemGroup>

    <Target Name = "Convert"
        Inputs="@(TXTFile)"
        Outputs="@(TXTFile->'%(Filename).content')">

        <GenerateContentFiles
            Sources = "@(TXTFile)">
            <Output TaskParameter = "OutputContentFiles"
                ItemName = "ContentFiles"/>
        </GenerateContentFiles>
    </Target>

    <Target Name = "Build" DependsOnTargets = "Convert"
        Inputs="@(ContentFiles);@(XMLFiles)"
        Outputs="$(MSBuildProjectName).help">

        <BuildHelp
            ContentFiles = "@(ContentFiles)"
            MetadataFiles = "@(XMLFiles)"
            OutputFileName = "$(MSBuildProjectName).help"/>
    </Target>
</Project>