Ответ 1
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
в конце цели с свойством, которое вы можете переопределить)
Зависит от заказов, ордеров 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