'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>
  BeforeTargets和AfterTargets可用于扩展现有的构build过程 。 
 例如,使用这个属性,你可以很容易地在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
我觉得答案要简单得多。 DependsOnTargets和AfterTargets的效果基本相同。 BeforeTargets&AfterTargets(来自Microsoft文档)的原因:
这使得项目作者可以扩展现有的一组目标而不需要直接修改它们。
所以如果你有一个现有的目标B,并且你想添加一个必须先执行的新目标A,那么你有两个select:
- 
修改目标B以读取:DependsOnTargets =“A”。 
- 
将目标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值显式提取到属性中以允许可扩展性。 
- VSTS 2010 SGEN:错误:无法加载文件或程序集(从HRESULTexception:0x80131515)
- 使用msbuild指定解决scheme的项目文件
- 如何通过命令行将属性传递给MSBuild,可以将其parsing为一个项目组?
- MSBuild命令行错误 – 未安装Silverlight 4 SDK
- 如何将ILMerge集成到Visual Studio生成过程中以合并程序集?
- MSbuild是否需要将Visual Studio安装在构build服务器上?
- 条件编译和框架目标
- 从解决scheme中删除nuget包恢复
- 卡住不活动的msbuild.exe进程,lockingStylecop.dll,Nuget AccessViolationException和CIbuild立相互冲突的奥秘