msbuild

What is the difference between 'DependsOnTargets' and 'AfterTargets'?


What is the difference between DependsOnTargets and AfterTargets? I can not distinguish these two.


Solution

  • DependsOnTargets

    Defines the targets that must be executed before the target can be executed.

    <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 and AfterTargets (Only available in MSBuild 4)

    Indicates that the target should run before or after the specified target or targets.

    <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
    

    BeforeTargets and AfterTargets could be use to extend existing build process.

    For example, with this attributes you can easily execute a target before CoreCompile (defines in Microsoft.CSharp.targets). Without that you'll have to override the property CoreCompileDependsOn.

    Without AfterTargets you have no way to easily execute a target after another one if no extension point is defined (CallTarget at the end of the target with a property that you can override)

    DependsOnTargets, BeforeTargets and AfterTargets execution order?

    When DependsOnTargets, BeforeTargets and AfterTargets are used on the same target, the order of execution is :