Порядок сборки целевого объекта

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

  • InitialTargets. Этот атрибут Project указывает целевые объекты, которые будут выполняться первыми, даже если целевые объекты указаны в командной строке или в атрибуте DefaultTargets.

  • DefaultTargets. Этот Project атрибут указывает, какие целевые объекты выполняются, если целевой объект не указан явно в командной строке.

  • DependsOnTargets. Этот атрибут Target указывает целевые объекты, которые необходимо выполнить перед запуском этого целевого объекта.

  • BeforeTargets и AfterTargets. Эти атрибуты Target указывают, что этот целевой объект должен выполняться до или после указанных целевых объектов.

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

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

Начальные целевые объекты

Атрибут InitialTargets элемента Project указывает целевые объекты, которые будут выполняться первыми, даже если целевые объекты указаны в командной строке или в атрибуте DefaultTargets. Начальные целевые объекты обычно используются для проверки ошибок.

Значение атрибута InitialTargets может представлять собой разделенный точкой с запятой упорядоченный список целевых объектов. В следующем примере указывается, что выполняется целевой объект Warm, а затем целевой объект Eject.

<Project InitialTargets="Warm;Eject" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

Импортированные проекты могут иметь собственные InitialTargets атрибуты. Все начальные целевые объекты собираются вместе и выполняются по порядку.

Дополнительные сведения см. в практическом руководстве по выбору цели для первой сборки.

Целевые объекты по умолчанию

Атрибут DefaultTargets элемента Project указывает, какой целевой объект или целевые объекты создаются, если целевой объект не задан явным образом в командной строке.

Значение атрибута DefaultTargets может представлять собой разделенный точкой с запятой упорядоченный список целевых объектов по умолчанию. В следующем примере указывается, что выполняется целевой объект Clean, а затем целевой объект Build.

<Project DefaultTargets="Clean;Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

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

msbuild -target:Build;Report

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

Импортированные проекты могут иметь собственные DefaultTargets атрибуты. Первый атрибут DefaultTargets определяет, какие целевые объекты по умолчанию будут выполняться.

Дополнительные сведения см. в практическом руководстве по выбору цели для первой сборки.

Первый целевой объект

Если начальные целевые объекты, целевые объекты по умолчанию или целевые объекты командной строки отсутствуют, MSBuild сначала выполняет первый обнаруженный целевой объект в файле проекта или любом импортированном файле проекта.

Зависимости целевого объекта

Целевые объекты могут описывать отношения зависимости друг от друга. Атрибут DependsOnTargets указывает, что целевой объект зависит от других целевых объектов. Например:

<Target Name="Serve" DependsOnTargets="Chop;Cook" />

сообщает MSBuild, что целевой объект Serve зависит от целевых объектов Chop и Cook. MSBuild выполняет целевой объект Chop, а затем выполняет объект Cook перед выполнением Serve.

Целевые объекты, выполняемые до и после заданного целевого объекта

Вы можете указать порядок целевых объектов с помощью атрибутов BeforeTargets и AfterTargets.

Рассмотрим следующий скрипт.

<Project DefaultTargets="Compile;Link" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Compile">
        <Message Text="Compiling" />
    </Target>
    <Target Name="Link">
        <Message Text="Linking" />
    </Target>
</Project>

Чтобы создать промежуточный целевой объект Optimize, который будет выполняться после объекта Compile, но до объекта Link, добавьте следующий целевой объект в любое место элемента Project.

<Target Name="Optimize" AfterTargets="Compile">
    <Message Text="Optimizing" />
</Target>

Или укажите порядок следующим образом:

<Target Name="Optimize" BeforeTargets="Link">
    <Message Text="Optimizing" />
</Target>

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

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

MSBuild определяет порядок сборки целевых объектов следующим образом.

  1. Выполняются целевые объекты InitialTargets.

  2. Выполняются целевые объекты, заданные в командной строке параметром -target. Если целевые объекты не указаны в командной строке, выполняются целевые объекты DefaultTargets. Если оба типа отсутствуют, выполняется первый обнаруженный целевой объект.

  3. Выполняется оценка атрибута Condition целевого объекта. Если атрибут Condition присутствует и имеет значение false, целевой объект не выполняется и не влияет на сборку.

    Другие целевые объекты, в которых указываются условные целевые объекты в BeforeTargets или AfterTargets, по-прежнему выполняются в предписанном порядке.

  4. Прежде чем целевой объект выполняется или пропускается, выполняются его целевые объекты DependsOnTargets, если атрибут Condition не применяется к целевому объекту и не дает в результате false.

    Примечание.

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

  5. Перед выполнением или пропуском целевого объекта выполняются все прочие целевые объекты, у которых он указан в атрибуте BeforeTargets.

  6. Перед выполнением целевого объекта сравниваются его атрибуты Inputs и Outputs. Если MSBuild определяет, что какие-либо выходные файлы неактуальны по отношению к соответствующему входному файлу или файлам, то MSBuild выполняет целевой объект. В противном случае MSBuild пропускает целевой объект.

  7. После выполнения или пропуска целевого объекта выполняются все прочие целевые объекты, у которых он указан в атрибуте AfterTargets.

См. также