В чем разница между «DependsOnTargets» и «AfterTargets»? - PullRequest
49 голосов
/ 18 мая 2010

Я не могу различить эти два. Пожалуйста, помогите!

Ответы [ 4 ]

67 голосов
/ 18 мая 2010

DependsOnTargets

Определяет цели, которые должны быть выполнены до цели могут быть выполнены.

<Target Name="DependsOn" DependsOnTargets="DependencyTarget1;DependencyTarget2">
  <Message Text="Target : DependsOn"/>
</Target>

<Target Name="DependencyTarget2">
  <Message Text="Target : DependencyTarget2"/>
</Target> 

<Target Name="DependencyTarget1">
  <Message Text="Target : DependencyTarget1"/>
</Target> 

Output
> Target : DependencyTarget1
> Target : DependencyTarget2
> Target : DependsOn

BeforeTargets и AfterTargets (доступно только в MSBuild 4)

Указывает, что цель должна выполнить до или после указанной цели или целей.

<Target Name="BeforeAndAfter">
  <Message Text="Target : BeforeAndAfter"/>
</Target>

<!-- BeforeTarget1 will run BEFORE target "BeforeAndAfter" -->
<Target Name="BeforeTarget" BeforeTargets="BeforeAndAfter">
  <Message Text="BeforeTarget run before : BeforeAndAfter"/>
</Target> 

<!-- BeforeTarget1 will run AFTER target "BeforeAndAfter" -->
<Target Name="AfterTarget" AfterTargets="BeforeAndAfter">
  <Message Text="AfterTarget run after : BeforeAndAfter"/>
</Target> 

Output
> BeforeTarget run before : BeforeAndAfter
> Target : BeforeAndAfter
> AfterTarget run after : BeforeAndAfter
  • Если у вас есть несколько целей, которые должны выполняться до или после одной и той же указанной цели, они будут выполнены в порядке объявления :

    <Target Name="BeforeAndAfter">
      <Message Text="Target : BeforeAndAfter"/>
    </Target>
    
    <!-- 
       BOTH BeforeTarget1 and BeforeTarget2 should run before target "BeforeAndAfter"
    -->
    <Target Name="BeforeTarget1" BeforeTargets="BeforeAndAfter">
      <Message Text="BeforeTarget1 run before : BeforeAndAfter"/>
    </Target> 
    
    <Target Name="BeforeTarget2" BeforeTargets="BeforeAndAfter">
      <Message Text="BeforeTarget2 run before : BeforeAndAfter"/>
    </Target> 
    

BeforeTargets и AfterTargets могут использоваться для расширения существующего процесса сборки .

Например, с помощью этих атрибутов вы можете легко выполнить цель до CoreCompile ( определяет в Microsoft.CSharp.targets ). Без этого вам придется переопределить свойство CoreCompileDependsOn.

Без AfterTargets у вас нет возможности легко выполнить цель за другой, если точка расширения не определена (CallTarget в конце цели со свойством, которое вы можете переопределить)

Порядок выполнения DependsOnTargets, BeforeTargets и AfterTargets?

Когда DependsOnTargets, BeforeTargets и AfterTargets используются на одной цели, порядок выполнения:

  • DependsOnTargets
  • BeforeTargets
  • Цель
  • AfterTargets

    <Target Name="MainTarget" DependsOnTargets="DefaultDependsOn">
      <Message Text="Target : MainTarget"/>
    </Target>
    
    <Target Name="DefaultDependsOn">
      <Message Text="Target : DefaultDependsOn"/>
    </Target>
    
    <Target Name="DefaultBeforeTarget" BeforeTargets="MainTarget">
      <Message Text="Target : DefaultBeforeTarget"/>
    </Target>
    
    <Target Name="DefaultAfterTarget" AfterTargets="MainTarget">
      <Message Text="Target : DefaultAfterTarget"/>
    </Target> 
    
    Output
    > Target : DefaultDependsOn
    > Target : DefaultBeforeTarget
    > Target : MainTarget
    > Target : DefaultAfterTarget
    
6 голосов
/ 05 декабря 2015

Я думаю, что ответ намного проще. Эффект DependsOnTargets и AfterTargets практически одинаков. Причина «До цели» и «После цели» (из документации Microsoft):

Это позволяет автору проекта расширить существующий набор целей без изменяя их напрямую.

Таким образом, если у вас есть существующая цель B и вы хотите добавить новую цель A, которая должна быть выполнена первой, у вас есть два варианта:

  1. Изменить цель B следующим образом: DependsOnTargets = "A".

  2. Изменить цель A следующим образом: BeforeTargets = "B".

Если вы не можете изменить B (например, это существующая цель Microsoft), тогда вам нужны BeforeTargets.

3 голосов
/ 13 сентября 2017

В то время как другие ранее предоставленные ответы верны, я думаю, что они не упомянули о том, что я считаю основным преимуществом AfterTargets над DependsOnTargets.

DependsOnTargets существует с самого начала MSBuild. Проблема с DependsOnTargets заключается в том, что целевому автору необходимо явно разрешить расширяемость. Это делается путем определения свойства, которое используется в качестве значения DependsOnTargets, следующим образом:

<PropertyGroup>
   <SomeTargetDependsOnTargets>
     Dependency1;Dependency2
   </SomeTargetDependsOnTargets>
</PropertyGroup>

<Target Name="SomeTarget" DependsOnTargets="$(SomeTargetDependsOnTargets)">
 ...
</Target>

Затем можно добавить зависимость, изменив свойство SomeTargetDependsOnTargets следующим образом:

<SomeTargetDependsOnTargets>
    $(SomeTargetDependsOnTargets);Dependency3
</SomeTargetDependsOnTargets>

Проблема с этим дизайном состоит в том, что если бы автор просто вставил Dependency1;Dependency2 вместо того, чтобы извлекать его в свойство, не было бы никакого способа изменить его внешне, чтобы обеспечить возможность настройки.

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

1 голос
/ 18 мая 2010

DependsOnTarget - давайте предположим, что у вас есть две задачи: 1 - построить проект, 2 - скопировать весь контент. Вы можете начать сборку, выполнив задачу 2, а затем в объявлении задачи определите ее зависимости. Поэтому, если вы определите, что задача 2 зависит от задачи 1, процесс сборки запустится и выполнит задачу 1, а затем 2.

AfterTargets - намного проще означает только задачи, которые выполняются после других целей. Итак, взяв пример сверху - после Задачи 1 - построить проект и выполнить задачу 2.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...