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