Порядок задач AfterBuild в проектах Visual Studio?

Я определил несколько задач AfterBuild в моем проекте Visual Studio с разными условиями:

<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'" как последний), AfterBuild для FinalBuilder-Configuration будет выполнен, но вариант для MvcBuildViews будет проигнорирован.

Важен ли порядок цели? Учитывается ли только последняя задача AfterBuild? Или как я могу определить разные задачи AfterBuild с разными условиями?

Спасибо

Конрад


person Konrad    schedule 03.01.2012    source источник


Ответы (2)


Выполняется только второй, потому что он был переопределен. См. 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> 
person Ludwo    schedule 03.01.2012
comment
Спасибо. Есть ли способ вложить блоки для каждого условия, чтобы мне не приходилось писать условие условия в каждом элементе? - person Konrad; 03.01.2012

Если вам действительно нужно запустить несколько задач 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".

person Chiara Coetzee    schedule 26.08.2017