Цели MSBuild
Обновлен: Ноябрь 2007
Целевые объекты позволяют группировать задачи в определенном порядке и вызывать разделы процесса построения из командной строки. Целевые объекты часто группируются в логические разделы, позволяя раскрыть файл проекта и повысить его удобочитаемость. Например, один целевой объект может удалить все файлы в выходном каталоге для подготовки к построению, тогда как другой целевой объект компилирует входные данные для проекта и помещает их в пустой каталог.
Объявление целевых объектов в файле проекта
Для объявления целевых объектов в файле проекта используется элемент Target. Например, с помощью следующего кода XML создается целевой объект с именем Compile, который затем вызывает задачу Csc с набором элементов Compile.
<Target Name="Compile>
<Csc Sources="@(Compile)" />
</Target>
Для целевых объектов можно также использовать атрибут Condition. Если заданное условие оказывается ложным, целевой объект не будет выполняться, и обработчик MSBuild не запустит целевые объекты, указанные в атрибуте DependsOnTargets. Дополнительные сведения об условиях см. в разделе Условия MSBuild.
Анализ зависимости
В развернутых сценариях целевые объекты могут описывать связи друг с другом и выполнять анализ зависимости, что позволяет пропускать целые разделы процесса построения, если такой целевой объект актуален. С помощью атрибута DependsOnTargets можно объявить целевые объекты, которые должны запускаться перед заданным целевым объектом. При запуске этого целевого объекта обработчик MSBuild будет сначала автоматически запускать все целевые объекты, указанные в этом атрибуте. Дополнительные сведения см. в разделе Практическое руководство. Инкрементное построение.
Примечание. |
---|
Целевой объект никогда не запускается дважды во время одного построения. Запущенный один раз целевой объект считается завершившим свою работу, и не будет запускаться еще раз, даже если от него зависит последующий целевой объект в построении. |
Рекомендация
Разбиение файла проекта таким способом позволяет изменять одни разделы файла, не затрагивая другие. Например, в качестве одного из способов построения проекта с ресурсами можно поместить задачи GenerateResource и Csc в один целевой объект:
<Target Name="Build">
<GenerateResource
Sources="alpha.resx; beta.txt"
<Output
TaskParameter="OutputResources"
ItemName="Resources"/>
</GenerateResource>
<Csc
Sources="hello.cs"
Resources="@(Resources)"
OutputAssembly="hello.exe"/>
</Target>
При использовании такого подхода проект создается в соответствии с требованиями, но целевой объект становится большим и негибким. Если позднее вы захотите добавить другие задачи для выполнения между GenerateResource и Csc, то после добавления всех этих задач в один целевой объект файл проекта станет очень сложным для чтения. Кроме того, при разработке таких больших целевых объектов с множеством задач становится значительно сложнее успешно выполнять инкрементные сборки — сборки, в которых перестраиваются только целевые объекты, не строившиеся ранее, или целевые объекты, ставшие неактуальными. Большие целевые объекты также препятствуют запуску целевых объектов для выполнения определенных задач. В приведенном ранее примере невозможно создание ресурсов без компиляции.
Лучше всего при разработке файла проекта использовать несколько целевых объектов и явно выразить зависимости между ними. Такой подход позволяет также запускать целевые объекты отдельно и выполнять меньший список задач, вместо того чтобы выполнять длинный список задач в одном целевом объекте при каждом построении. В данном примере каждая задача представляет собой отдельный целевой объект, и атрибут DependsOnTargets указывает, что целевой объект Resources должен запускаться до запуска целевого объекта Build.
<Target Name="Resources">
<GenerateResource
Sources="alpha.resx; beta.txt"
<Output
TaskParameter="OutputResources"
ItemName="Resources"/>
</GenerateResource>
</Target>
<Target Name="Build" DependsOnTargets="Resources">
<Csc
Sources="hello.cs"
Resources="@(Resources)"
OutputAssembly="hello.exe"/>
</Target>
См. также
Задачи
Практическое руководство. Выбор цели для первого построения
Как использовать одинаковый целевой объект в нескольких файлах проектов