Visual Studio项目中的AfterBuild任务顺序......?

时间:2012-01-03 09:08:48

标签: visual-studio-2010 msbuild msbuild-task visual-studio-project

我在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>

但是如果条件匹配,则仅执行最后一个。如果我选择FinalBuilder-Configuration,则忽略AfterBuild任务而不执行。如果我更改项目文件中的Targets的顺序(Condition =“'$(Configuration)'=''FinalBuilder'”作为最后一个),则执行AfterBuild for FinalBuilder-Configuration,但忽略MvcBuildViews的。 / p>

目标的顺序是否重要?是否只考虑了最后的AfterBuild任务?或者如何使用不同的条件定义不同的AfterBuild任务?

由于

康拉德

2 个答案:

答案 0 :(得分:34)

唯一的第二个被执行,因为它被重新定义。请参阅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> 

答案 1 :(得分:4)

如果您确实需要运行多个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" />

如果您需要约束他们的订单,只需让AfterBuild2依赖于AfterBuild1 DependsOnTargets="AfterBuild1"