代码之家  ›  专栏  ›  技术社区  ›  Nam G VU

什么时候应该使用“dependsOnTargets”和“callTarget>调用目标?

  •  28
  • Nam G VU  · 技术社区  · 15 年前

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

    我的问题是我们什么时候使用每个箱子?

    2 回复  |  直到 15 年前
        1
  •  54
  •   MStodd    7 年前

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

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

    反之 DependsOnTargets 是一个 隐性的 方法, MSBube 通过检查目标的依赖关系推断调用顺序。

    两者没有区别 调用目标 从属目标 目标可以运行的时间: 一个目标在一次生成过程中不会运行两次 (除非你 use MSBuild task with different property )

    调用目标的限制

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

    <Target Name="Caller">
      <CreateProperty Value="MyValue">
        <OutputTaskParameter="Value" PropertyName="NewProperty"/>
      </CreateProperty>
      <CallTarget Targets="Called"/>
    </Target>
    
    <Target Name="Called">
      <Message Text="$(NewProperty)"/>
    </Target>
    

    在创建动态属性的目标执行完毕之前,不会发布动态属性。使用时没有此问题 DependsOnTarget

    我应该使用什么?

    你应该使用 从属目标 对于需要在目标之前执行的目标。和 调用目标 以便在目标之后执行。微软就是这样做的。

    <Target Name="CoreCompile"
            DependsOnTargets="$(CoreCompileDependsOn)">
      <!-- Target execution -->
      <Csc ... />
      ...
    
      <!-- Targets to execute after -->
      <CallTarget Targets="$(TargetsTriggeredByCompilation)"/>      
    </Target>
    
        2
  •  -3
  •   Indolent Coder    15 年前

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

    你可以这样想 请确保此目标已执行,如果没有,则执行它。

    CallTarget 只执行指定的目标,不管它以前是否执行过。