我们什么时候应该使用'DependsOnTargets'和<CallTarget>来调用目标?

Nam*_* VU 28 msbuild

据我所知,目前我们可以通过使用属性DependsOnTargets或使用任务来调用目标中的其他目标<CallTarget ...>

我的问题是我们应该何时使用每个案例?

Jul*_*rau 54

MSBuild提供了不同的调用目标的方法:

使用CallTarget是一种显式方法,从第一个目标开始,并按您想要的顺序显式调用每个目标.

虽然DependsOnTargets隐式方法,但MSBuild通过检查目标的依赖性来推断调用顺序.

有没有什么区别CallTarget,并DependsOnTargets在目标上可以运行的时间数:目标永远不会单一的构建过程中运行两次(除非你使用具有不同属性的MSBuild任务)

CallTarget的限制

动态项和属性的一个限制CallTarget是:您无法访问在使用CallTarget调用的另一个目标中的目标中创建的项或属性:

<Target Name="Caller">
  <CreateProperty Value="MyValue">
    <OutputTaskParameter="Value" PropertyName="NewProperty"/>
  </CreateProperty>
  <CallTarget Targets="Called"/>
</Target>

<Target Name="Called">
  <Message Text="$(NewProperty)"/>
</Target>
Run Code Online (Sandbox Code Playgroud)

在创建它们的目标执行完毕之前,不会发布动态属性.你没有使用这个问题DependsOnTarget

我该怎么用?

您应该使用DependsOnTargets需要在目标之前执行的目标.并且CallTarget目标在目标之后执行.这就是微软这样做的方式.

<Target Name="CoreCompile"
        DependsOnTargets="$(CoreCompileDependsOn)">
  <!-- Target execution -->
  <Csc ... />
  ...

  <!-- Targets to execute after -->
  <CallTarget Targets="$(TargetsTriggeredByCompilation)"/>      
</Target>
Run Code Online (Sandbox Code Playgroud)

  • +1详细解释.我个人尽量避免使用CallTarget,而是使用DependsOnTargets. (4认同)