Инкрементные построения
Инкрементные построения представляют собой построения, оптимизированные таким образом, что целевые объекты с выходными файлами, актуальными в отношении соответствующих входных файлов, не выполняются.Целевой объект может иметь как атрибут Inputs (указывающий, какие элементы целевой объект должен ожидать в качестве входных), так и атрибут Outputs (указывающий, какие элементы создаются на выходе).MSBuild пытается найти сопоставление 1 к 1 между значениями этих атрибутов.При наличии сопоставления 1 к 1 MSBuild сравнивает отметку времени каждого входного элемента с отметкой времени соответствующего выходного элемента.Выходные файлы без сопоставления 1 к 1 сравниваются со всеми входными файлами.Элемент считается актуальным, если время существования выходного файла равно или больше времени существования входного файла или файлов.
Если все выходные элементы актуальны, MSBuild пропускает целевой объект.Такое инкрементное построение целевого объекта может существенно увеличить скорость построения.Если актуально только несколько файлов, MSBuild выполняет целевой объект, но пропускает актуальные элементы и, таким образом, делает все элементы актуальными.Это называется частичное инкрементное построение.
Сопоставления 1 к 1, как правило, создаются в результате преобразований элементов.Дополнительные сведения см. в разделе Преобразования MSBuild.
Рассмотрим следующий целевой объект.
<Target Name="Backup" Inputs="@(Compile)"
Outputs="@(Compile->'$(BackupFolder)%(Identity).bak')">
<Copy SourceFiles="@(Compile)" DestinationFiles=
"@(Compile->'$(BackupFolder)%(Identity).bak')" />
</Target>
Набор файлов, представленный типом элемента Compile, копируется в каталог резервного копирования.Файлы резервной копии имеют расширение BAK.Если файлы, представленные типом элемента Compile, или соответствующие файлы резервной копии не удаляются и не изменяются после выполнения целевого объекта резервного копирования, при последующих построениях такой целевой объект пропускается.
Прогнозирование на выходе
MSBuild сравнивает атрибуты Inputs и Outputs целевого объекта с целью определения необходимости его выполнения.В идеальном случае набор файлов, остающийся после завершения инкрементного построения, должен оставаться тем же самым независимо от того, выполнялись ли связанные с ним целевые объекты.Поскольку свойства и элементы, создаваемые или изменяемые задачами, могут повлиять на построение, платформа MSBuild должна прогнозировать их значения, даже если влияющий на них целевой объект пропускается.Это называется прогнозирование на выходе.
Всего существует три случая:
У целевого элемента есть атрибут Condition, имеющий значение false.В этом случае целевой объект не выполняется и не влияет на построение.
Целевой объект имеет неактуальные выходные данные и выполняется для обеспечения их актуальности.
Целевой объект не имеет неактуальных выходных данных и пропускается.MSBuild анализирует целевой объект и вносит изменения в элементы и свойства, как если бы целевой объект был выполнен.
С целью поддержки инкрементной компиляции задачи должны обеспечить равенство значения атрибута TaskParameter любого элемента Output входному параметру задачи.Далее представлено несколько примеров.
<CreateProperty Value="123">
<Output PropertyName="Easy" TaskParameter="Value" />
</CreateProperty>
При этом создается свойство Easy со значением "123" независимо от того, был ли целевой объект выполнен или пропущен.
<CreateItem Include="a.cs;b.cs">
<Output ItemName="Simple" TaskParameter="Include" />
</CreateItem>
При этом создается тип элемента Simple с двумя элементами "a.cs" и "b.cs" независимо от того, был ли целевой объект выполнен или пропущен.
В MSBuild 3.5 прогнозирование на выходе выполняется автоматически для групп элементов и свойств в целевом объекте.В целевом объекте не требуются задачи CreateItem, и их следует избегать.Кроме того, задачи CreateProperty должны использоваться в целевом объекте только для определения, был ли целевой объект выполнен.
Определение, был ли выполнен целевой объект
Из-за выполнения прогнозирования на выходе к целевому элементу следует добавить задачу CreateProperty с целью анализа свойств и элементов, чтобы можно было определить, выполнялся ли целевой объект.Добавьте к целевому объекту задачу CreateProperty и передайте ему элемент Output, значение параметра TaskParameter которого "ValueSetByTask".
<CreateProperty Value="true">
<Output TaskParameter="ValueSetByTask" PropertyName="CompileRan" />
</CreateProperty>
При этом создается свойство CompileRan, и ему присваивается значение true, но только в случае выполнения целевого объекта.Если целевой объект пропускается, свойство CompileRan не создается.