Msbuild ';依赖于目标';和';后目标';?

Msbuild ';依赖于目标';和';后目标';?,msbuild,Msbuild,DependsOnTargets和postertargets之间有什么区别? 我无法区分这两者。DependsOnTarget 假设您有两项任务: 建设项目 复制所有内容 您可以通过执行任务2开始构建,然后在任务声明中定义其依赖项。因此,如果定义任务2依赖于任务1,则构建过程将启动并执行任务1,然后执行任务2 后目标 更简单:它只意味着在其他目标之后执行的任务。以上面的例子为例,在任务1之后,构建项目执行任务2 我希望这有助于 定义在执行目标之前必须执行的目标 <Target Name="

DependsOnTargets
postertargets
之间有什么区别? 我无法区分这两者。

DependsOnTarget
假设您有两项任务:

  • 建设项目
  • 复制所有内容
  • 您可以通过执行任务2开始构建,然后在任务声明中定义其依赖项。因此,如果定义任务2依赖于任务1,则构建过程将启动并执行任务1,然后执行任务2

    后目标
    更简单:它只意味着在其他目标之后执行的任务。以上面的例子为例,在任务1之后,构建项目执行任务2

    我希望这有助于

    定义在执行目标之前必须执行的目标

    <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
    

      我认为答案要简单得多。
      DependsOnTargets
      postertargets
      的效果基本相同。在目标前<代码>和目标后<代码>的原因(来自Microsoft文档):

      这使项目作者可以扩展现有的一组目标,而无需 直接修改它们

      因此,如果您有一个现有的目标B,并且您想添加一个必须首先执行的新目标a,那么您有两个选择:

    • 将目标B修改为:
      DependsOnTargets=“A”

    • 将目标A修改为:
      BeforeTargets=“B”


    • 如果您不能修改B(例如,它是一个现有的Microsoft目标),那么此时您需要在目标之前进行

      ,而之前提供的其他答案是正确的,我认为他们没有提到我认为的
      后目标
      优于
      依赖目标
      的主要好处

      DependsOnTargets
      从MSBuild开始就存在。
      DependsOnTargets
      的问题在于,它需要目标作者明确允许扩展性。这是通过定义一个用作
      DependsOnTargets
      值的属性来实现的,如下所示:

      <PropertyGroup>
         <SomeTargetDependsOnTargets>
           Dependency1;Dependency2
         </SomeTargetDependsOnTargets>
      </PropertyGroup>
      
      <Target Name="SomeTarget" DependsOnTargets="$(SomeTargetDependsOnTargets)">
       ...
      </Target>
      
      <SomeTargetDependsOnTargets>
          $(SomeTargetDependsOnTargets);Dependency3
      </SomeTargetDependsOnTargets>
      
      这种设计的问题在于,如果作者只是内联了
      Dependency1;Dependency2
      没有办法将其提取到属性中,而是从外部修改它以允许自定义

      另一方面,
      postertargets
      不要求原始目标作者将
      DependsOnTargets
      值显式提取到属性中以允许扩展性。

      更简洁地说:

      表示:

      如果要运行
      x
      y
      必须先运行

      表示:


      如果某个东西运行
      b
      ,那么在它之后运行
      a

      主要有两个区别:

      • 第一:dependsOnTargets属性中指定的目标是 在后目标之前执行

      • 第二:如果在后目标属性中指定的一个目标被执行 这个目标也会在之后执行(我指的是目标 其中指定了“后目标”属性),但对于 那些在dependson中的目标


      另一个例子中提到的另一个区别是“
      BeforeTargets
      BeforeTargets
      在不考虑条件的情况下运行,而当条件评估为false时,则跳过
      DependsOnTargets
      (和目标本身)”

    • 在下面的代码中,即使未执行第一个目标,也会执行第二个目标:
    • 
      
    • 在以下代码中,未执行第二个目标:
    • 
      
      我认为你的执行顺序错了;应该是
      postertargets->The target->BeforeTargets
      。我不明白为什么这个答案是最高评分的。它不能解释后目标和依赖目标之间的行为差异。史蒂夫·罗宾斯在评论你的第二句话时说:“不,它们不一样。”。有一个奇怪的扭曲,每个人都没有提到:考虑建立目标A,如在代码> MSBudio/t:一个< /代码>。当使用
      DependsOnTargets
      属性指定依赖项时,以这种方式调用msbuild不会生成目标B。但是,当使用
      postertargets
      属性指定依赖项时,以这种方式调用msbuild会生成目标B。@aprelev:好的,很公平。在我的辩护中:我确实说过“基本上”:-)我只考虑依赖链,假设初始目标是“B”或依赖它的东西。谢谢你指出这个微妙之处。谢谢@aprelev,你的评论是我在整个页面中找到的唯一有用的东西。非常感谢。我认为你的回答正确地回答了这个问题。不知道为什么这些意思的解释被标记为答案。无论如何,你的回答确实帮助我理解了其中的区别。谢谢
      <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
      
      <PropertyGroup>
         <SomeTargetDependsOnTargets>
           Dependency1;Dependency2
         </SomeTargetDependsOnTargets>
      </PropertyGroup>
      
      <Target Name="SomeTarget" DependsOnTargets="$(SomeTargetDependsOnTargets)">
       ...
      </Target>
      
      <SomeTargetDependsOnTargets>
          $(SomeTargetDependsOnTargets);Dependency3
      </SomeTargetDependsOnTargets>
      
          <Target Name="FirstTarget" AfterTargets="PostBuildEvent" Condition="'False'">
              <Message Text="This target is never executed" />
          </Target>
      
          <Target Name="SecondTarget" AfterTargets="FirstTarget">
              <Message Text="SecondTarget is executed" />
          </Target>
      
          <Target Name="FirstTarget" AfterTargets="PostBuildEvent" Condition="'False'">
              <Message Text="This target is never executed" />
          </Target>
      
          <Target Name="SecondTarget" DependsOnTargets="FirstTarget">
              <Message Text="SecondTarget is executed" />
          </Target>