Visual Studio项目中AfterBuild任务的顺序是什么?

24

我在Visual Studio项目中定义了几个具有不同条件的AfterBuild - Tasks:

<Target Name="AfterBuild" Condition="'$(Configuration)'=='FinalBuilder'">
    <Message Importance="high" Text="--- AfterBuild for FinalBuilder ---" />
</Target>
<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <Message Importance="high" Text="--- AfterBuild for MvcBuildViews ---" />
</Target>

但是只有最后一个匹配条件的AfterBuild任务会被执行。如果我选择了FinalBuilder-Configuration,那么AfterBuild任务会被忽略且不会被执行。如果我在项目文件中改变Target的顺序(将Condition="'$(Configuration)'=='FinalBuilder'"放在最后),那么针对FinalBuilder-Configuration的AfterBuild任务会被执行,但MvcBuildViews的任务则被忽略。

Target的顺序很重要吗?只有最后一个AfterBuild任务会被考虑吗?还是说我该如何定义具有不同条件的不同AfterBuild任务呢?

谢谢

Konrad

2个回答

38

只有第二个被执行,因为它已被重新定义。请参见MSDN(项目文件章节中声明目标的部分)。

您应该在项目文件中只使用一个AfterBuild目标,如下所示:

<Target Name="AfterBuild" >
    <Message Condition="'$(MvcBuildViews)'=='true'" Importance="high" Text="--- AfterBuild for MvcBuildViews ---" />
    <Message Condition="'$(Configuration)'=='FinalBuilder'" Importance="high" Text="--- AfterBuild for FinalBuilder ---" />
</Target> 

编辑: 或使用CallTarget任务:

<Target Name="AfterBuild" >
    <CallTarget Condition="'$(MvcBuildViews)'=='true'" Targets="MvcBuildTarget" />
    <CallTarget Condition="'$(Configuration)'=='FinalBuilder'" Targets="FinalBuilderTarget" />
</Target> 

<Target Name="MvcBuildTarget">
    <Message Importance="high" Text="--- AfterBuild for MvcBuildViews ---" />
</Target> 

<Target Name="FinalBuilderTarget" >
    <Message Importance="high" Text="--- AfterBuild for FinalBuilder ---" />
</Target> 

谢谢。是否有一种方法可以为每个条件嵌套块-这样我就不必在每个单独的项目中编写条件子句了? - Konrad

5

如果你确实需要运行多个 AfterBuild 任务(例如,如果你需要为每个任务设置不同的输入和输出集),你可以使用 DependsOnTarget 简单地使 AfterBuild 依赖于所有这些任务:

  <Target Name="AfterBuild1"
    Inputs="stuff"
    Outputs="stuff">
      <Message Text="Running first after build task."  Importance="high" />
      <Exec Command="stuff" />
  </Target>
  <Target Name="AfterBuild2"
    Inputs="other stuff"
    Outputs="other stuff">
      <Message Text="Running other after build task."  Importance="high" />
      <Exec Command="stuff" />
  </Target>
  <Target Name="AfterBuild" DependsOnTargets="AfterBuild1;AfterBuild2" />

如果您需要限制它们的顺序,只需使用 DependsOnTargets="AfterBuild1" 使 AfterBuild2 依赖于 AfterBuild1。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接