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

时间:2010-05-12 04:17:41

标签: msbuild

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

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

2 个答案:

答案 0 :(得分:54)

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

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

DependsOnTargets隐式方法, MSBuild 通过检查目标的依赖关系来推断调用顺序。

目标可以投放的时间CallTargetDependsOnTargets之间没有区别:目标在单次构建期间永远不会运行两次(除非您use MSBuild task with different property

CallTarget的限制

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

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

<Target Name="Called">
  <Message Text="$(NewProperty)"/>
</Target>

动态属性在创建它们的目标完成执行之前不会发布。您使用DependsOnTarget

没有此问题

我应该使用什么?

您应该将DependsOnTargets用于需要在目标之前执行的目标。并且CallTarget可以在您的目标之后执行目标。这就是微软的做法。

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

  <!-- Targets to execute after -->
  <CallTarget Targets="$(TargetsTriggeredByCompilation)"/>      
</Target>

答案 1 :(得分:-3)

关键区别在于DependsOnTarget 中指定的目标如果先前已执行,则不会执行。通过这种方式,多个目标可以具有相同的依赖关系,但只有第一个目标才会触发其执行(see MSDN documentation)。

您可以将其视为“确保此目标已执行,并在未执行时执行。”

CallTarget只会执行指定的目标,无论它是否先前执行过。