Как остановить выполнение MSBuild, не вызывая ошибки? - PullRequest
7 голосов
/ 18 февраля 2010

В MSBuild, как только возникает ошибка, выполнение проекта останавливается, если ContinueOnError=true.

Есть ли способ остановить выполнение проекта без появления ошибки?

Я хотел бы иметь такую ​​возможность, потому что у меня есть существующий набор файлов проекта msbuild, и в некоторых случаях мне нужно было бы прекратить обработку проектов без появления ошибки, потому что это нормальная точка выхода для процесса, и не хочу, чтобы человек, использующий сценарий, думал, что что-то не так.

Я знаю, что мог бы просто установить какое-либо свойство и поставить все остальные задачи в зависимость от этого, но я бы хотел этого избежать.

Ответы [ 3 ]

9 голосов
/ 19 февраля 2010

Как вы объясняете, вы хотите остановить сборку при особых обстоятельствах, не вызывая ошибки, потому что это нормальная точка выхода. Почему бы не создать цель, не делающую ничего, что послужит вашей точкой выхода. При особых условиях вы назовете эту цель.

<target Name="BuildProcess">
   <Message Text="Build starts"/>
   ...
   <CallTarget Targets="Exit"
               Condition="Special Condition"/>

   <CallTarget Targets="Continue"
               Condition="!(Special Condition)"/> 
   ...     
</target>

<target Name="Continue">
  <Message Text="Build continue"/>  
</target>

<target Name="Exit">
  <!-- This target could be removed -->
  <!-- Only used for logging here -->
  <Message Text="Build ended because special condition occured"/>
</target>
2 голосов
/ 01 декабря 2010

Способ сделать это - создать еще одну цель, чтобы обернуть цель, которую вы интересуетесь подготовкой.

Итак, если у вас есть сценарий с такой целью:

<Target Name="MainTarget">
command - run under a certain condition
command - run under a certain condition
command - run under a certain condition
command - run under a certain condition
command - run under a certain condition
</Target>

Дело в том, что вы хотите избавиться от необходимости использовать оператор условия целую кучу раз, верно?

Для решения этой проблемы вы можете сделать следующее:

<Target Name="MainWrapper" DependsOnTargets="EstablishCondition;MainTarget" />

<Target Name="EstablishCondition">
<SomeCustomTask Input="blah">
 <Output PropertyName="TestProperty" TaskParameter="value" />
</SomeCustomTask>
</Target>

<Target Name="MainTarget" Condition="$(TestProperty)='true'">

command
command
command
command
command

</Target>
1 голос
/ 10 июня 2013

В конце концов нашли элегантное решение для аналогичной проблемы.Мне просто нужно перефразировать мою озабоченность с " Прерывание / прерывание выполнения MSBuild " на " Пропуск следующих целей ".

<PropertyGroup>
 <LastInfoFileName>LastInfo.xml</LastInfoFileName>
 <NewInfoFileName>NewInfo.xml</NewInfoFileName>
</PropertyGroup>

<Target Name="CheckSomethingFirst" BeforeTargets="DoSomething">

 <Message Condition="ConditionForContinue"
          Text="Let's carry on with next target" />
 <WriteLinesToFile Condition="ConditionForContinue" 
                   File="$(NewInfoFileName)"
                   Lines="@(SomeText)"
                   Overwrite="true" />

 <Message Condition="!ConditionForContinue"
          Text="Let's discard next target" />
 <Copy Condition="!ConditionForContinue"
       SourceFiles="$(LastInfoFileName)"
       DestinationFiles="$(NewInfoFileName)" />

</Target>

<Target Name="DoSomething" Inputs="$(NewInfoFileName)"
                           Outputs="$(LastInfoFileName)">
 <Message Text="DoSomethingMore" />
 <Copy SourceFiles="$(NewInfoFileName)"
       DestinationFiles="$(LastInfoFileName)" />
</Target>

Это нормально работает с командойнапример:

msbuild.exe Do.targets /t:DoSomething

, где цель DoSomething Входы / выходы правильно проверяются после выполнения цели CheckSomethingFirst .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...