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


Цели MSBuild

Обновлен: Ноябрь 2007

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

Объявление целевых объектов в файле проекта

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

<Target Name="Compile>
    <Csc Sources="@(Compile)" />
</Target>

Для целевых объектов можно также использовать атрибут Condition. Если заданное условие оказывается ложным, целевой объект не будет выполняться, и обработчик MSBuild не запустит целевые объекты, указанные в атрибуте DependsOnTargets. Дополнительные сведения об условиях см. в разделе Условия MSBuild.

Анализ зависимости

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

ms171462.alert_note(ru-ru,VS.90).gifПримечание.

Целевой объект никогда не запускается дважды во время одного построения. Запущенный один раз целевой объект считается завершившим свою работу, и не будет запускаться еще раз, даже если от него зависит последующий целевой объект в построении.

Рекомендация

Разбиение файла проекта таким способом позволяет изменять одни разделы файла, не затрагивая другие. Например, в качестве одного из способов построения проекта с ресурсами можно поместить задачи 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>

См. также

Задачи

Практическое руководство. Выбор цели для первого построения

Как использовать одинаковый целевой объект в нескольких файлах проектов

Основные понятия

Общие сведения о MSBuild

Другие ресурсы

Основные возможности MSBuild