'DependsOnTargets'和'AfterTargets'有什么区别?

我无法区分这两个。 请帮忙!

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> 

BeforeTargetsAfterTargets可用于扩展现有的构build过程

例如,使用这个属性,你可以很容易地在CoreCompile在Microsoft.CSharp.targets中定义 )之前执行一个目标。 没有这一点,你将不得不重写属性CoreCompileDependsOn

如果没有AfterTargets ,如果没有定义扩展点,则无法轻松地在另一个目标之后执行目标( CallTarget在具有可覆盖属性的目标末尾)

取决于目标,BeforeTargets和AfterTargets执行顺序?

当在同一个目标上使用DependsOnTargetsBeforeTargetsAfterTargets ,执行的顺序是:

  • 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 

我觉得答案要简单得多。 DependsOnTargets和AfterTargets的效果基本相同。 BeforeTargets&AfterTargets(来自Microsoft文档)的原因:

这使得项目作者可以扩展现有的一组目标而不需要直接修改它们。

所以如果你有一个现有的目标B,并且你想添加一个必须先执行的新目标A,那么你有两个select:

  1. 修改目标B以读取:DependsOnTargets =“A”。

  2. 将目标A修改为:BeforeTargets =“B”。

如果你不能修改B(例如它是一个现有的微软目标),那就是当你需要BeforeTargets的时候。

DependsOnTarget – 让我们假设你有两个任务:1 – 生成项目,2 – 复制所有内容。 你可以通过执行任务2开始构build,然后在任务声明中定义它的依赖关系。 所以如果你定义的任务2取决于任务1,构build过程将启动并执行任务1,然后执行2。

AfterTargets – 更简单的意思是只有在其他目标之后执行的任务。 因此,从上面的例子 – 任务1之后 – build立项目执行任务2。

我希望这有帮助

虽然之前提供的其他答案是正确的,但我认为他们没有提到我认为是AfterTargets而非DependsOnTargets的主要优势。

DependsOnTargets已经从MSBuild开始。 DependsOnTargets的问题在于,它需要目标作者明确允许可扩展性。 这是通过定义一个用作DependsOnTargets值的属性来完成的,如下所示:

 <PropertyGroup> <SomeTargetDependsOnTargets> Dependency1;Dependency2 </SomeTargetDependsOnTargets> </PropertyGroup> <Target Name="SomeTarget" DependsOnTargets="$(SomeTargetDependsOnTargets)"> ... </Target> 

然后,您可以通过修改SomeTargetDependsOnTargets属性来添加依赖SomeTargetDependsOnTargets ,如下所示:

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

这个devise的问题是,如果作者只是简单地将Dependency1;Dependency2内联Dependency1;Dependency2而不是将其解压到一个属性中,那么就没有办法从外部修改它来允许自定义。

另一方面, AfterTargets并不要求原始目标作者将DependsOnTargets值显式提取到属性中以允许可扩展性。