'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立相互冲突的奥秘