24

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

<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 任务将被忽略且不执行。如果我更改项目文件中目标的顺序(Condition="'$(Configuration)'=='FinalBuilder'" 作为最后一个),则执行 FinalBuilder-Configuration 的 AfterBuild 但忽略 MvcBuildViews 的顺序。

目标的顺序重要吗?是否只考虑了最后一个 AfterBuild 任务?或者我如何定义具有不同条件的不同 AfterBuild 任务?

谢谢

康拉德

4

2 回答 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> 
于 2012-01-03T09:34:21.743 回答
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" />

如果您需要限制它们的顺序,只需让 AfterBuild2 依赖于 AfterBuild1 和DependsOnTargets="AfterBuild1".

于 2017-08-26T04:04:46.763 回答