Практическое руководство. Расширение процесса построения Visual Studio
Процесс построения Visual Studio определен в серии файлов MSBuild .targets, которые импортируются в файл проекта.Один из импортированных файлов, Microsoft.Common.targets, можно расширить, добавив возможность выполнения пользовательских задач в нескольких точках процесса построения.В данном разделе описываются два способа расширения процесса построения Visual Studio.
Переопределение конкретных предопределенных целевых объектов, определения которых содержатся в файле Microsoft.Common.targets.
Переопределение свойств "DependsOn", определения которых содержатся в файле Microsoft.Common.targets.
Переопределение предопределенных целевых объектов
В файле Microsoft.Common.targets содержится ряд предопределенных пустых целевых объектов, которые в процессе построения вызываются до и после некоторых основных целевых объектов.Например, MSBuild вызывает целевой объект BeforeBuild перед основным целевым объектом CoreBuild и целевой объект AfterBuild после основного целевого объекта CoreBuild.По умолчанию пустые целевые объекты в файле Microsoft.Common.targets не выполняют никаких действий, но их заданное по умолчанию поведение можно переопределить, определяя нужные целевые объекты в файле проекта, в который импортируется файл Microsoft.Common.targets.При этом можно с помощью задач MSBuild получить больший контроль над процессом построения.
Переопределение предопределенных целевых объектов
В файле Microsoft.Common.targets выберите предопределенный целевой объект, который нужно переопределить.В приведенной ниже таблице содержится полный список целевых объектов, которые можно без опаски переопределить.
Определите целевой объект или целевые объекты в конце файла проекта, сразу после тега </Project>.Примеры.
<Project> ... <Target Name="BeforeBuild"> <!-- Insert tasks to run before build here --> </Target> <Target Name="AfterBuild"> <!-- Insert tasks to run after build here --> </Target> </Project>
Создайте файл проекта.
В следующей таблице показаны все целевые объекты из файла Microsoft.Common.targets , которые можно без опаски переопределить.
Целевое имя |
Описание |
---|---|
BeforeCompile, AfterCompile |
Задачи, добавленные в один из этих целевых объектов, выполняются до или после основной компиляции.Большая часть настроек выполняется в одном из этих двух целевых объектов. |
BeforeBuild, AfterBuild |
Задачи, добавленные в один из этих целевых объектов, выполняются до или после какой-либо операции в построении.
Примечание
Целевые объекты BeforeBuild и AfterBuild уже определены в комментариях в конце большинства файлов проекта.Благодаря этому вы можете просто добавить в файл проекта события, выполняемые до и после построения.
|
BeforeRebuild, AfterRebuild |
Задачи, добавленные в один из этих целевых объектов, выполняются до или после вызова основных функций повторного построения.Порядок выполнения целевых объектов в файле Microsoft.Common.targets: BeforeRebuild, Clean, Build, а затем AfterRebuild. |
BeforeClean, AfterClean |
Задачи, добавленные в один из этих целевых объектов, выполняются до или после вызова основных функций очистки. |
BeforePublish, AfterPublish |
Задачи, добавленные в один из этих целевых объектов, выполняются до или после вызова основных функций публикации. |
BeforeResolveReference, AfterResolveReferences |
Задачи, добавленные в один из этих целевых объектов, выполняются до или после разрешения ссылок построения. |
BeforeResGen, AfterResGen |
Задачи, добавленные в один из этих целевых объектов, выполняются до или после создания ресурсов. |
Переопределение свойств "DependsOn"
Самый простой способ расширения процесса построения — это переопределение предопределенных целевых объектов, однако, посколькуMSBuild оценивает определение целевых объектов последовательно, ничто не может помешать другому проекту, в который импортируется данный проект, переопределить целевые объекты, которые уже переопределены вами.Например, последний целевой объект AfterBuild, определенный в файле проекта, после импорта всех остальных проектов окажется тем целевым объектом, который используется во время построения.
Для защиты от нежелательных переопределений целевых объектов можно переопределить свойства "DependsOn", которые используются в атрибутах DependsOnTargets по всему файлу Microsoft.Common.targets.Например, в целевом объекте Build содержится атрибут DependsOnTargets со значением "$(BuildDependsOn)".Рассмотрим этот пример:
<Target Name="Build" DependsOnTargets="$(BuildDependsOn)"/>
В этом фрагменте XML-кода указывается, что перед выполнением целевого объекта Build необходимо выполнить все целевые объекты, указанные в свойстве BuildDependsOn.Свойство BuildDependsOn определяется следующим образом:
<PropertyGroup>
<BuildDependsOn>
BeforeBuild;
CoreBuild;
AfterBuild
</BuildDependsOn>
</PropertyGroup>
Чтобы переопределить значение этого свойства, нужно объявить в конце файла проекта другое свойство с именем BuildDependsOn.Включая предыдущее свойство BuildDependsOn в новое свойство, можно добавить новые целевые объекты в начало и конец списка целевых объектов.Примеры.
<PropertyGroup>
<BuildDependsOn>
MyCustomTarget1;
$(BuildDependsOn);
MyCustomTarget2
</BuildDependsOn>
</PropertyGroup>
<Target Name="MyCustomTarget1">
<Message Text="Running MyCustomTarget1..."/>
</Target>
<Target Name="MyCustomTarget2">
<Message Text="Running MyCustomTarget2..."/>
</Target>
В проектах, в которые импортируются файлы проекта, можно переопределить эти свойства, не перезаписывая выполненные пользователем настройки.
Переопределение свойства "DependsOn"
В файле Microsoft.Common.targets выберите предопределенное свойство "DependsOn", которое нужно переопределить.В приведенной ниже таблице см. список наиболее часто переопределяемых свойств "DependsOn".
Определите еще один экземпляр свойства или свойств в конце файла проекта.В новое свойство включите исходное свойство, например $(BuildDependsOn).
Определите пользовательские целевые объекты до или после определения свойства.
Создайте файл проекта.
Часто переопределяемые свойства "DependsOn"
Имя свойства |
Описание |
---|---|
BuildDependsOn |
Свойство следует переопределить, если требуется вставить пользовательские целевые объекты до или после всего процесса построения. |
CleanDependsOn |
Свойство следует переопределить, если требуется убрать выходной файл из настраиваемого процесса построения. |
CompileDependsOn |
Свойство следует переопределить, если требуется вставить пользовательские процессы до или после этапа компиляции. |
См. также
Ссылки
Основные понятия
Интеграция Visual Studio (MSBuild)