2010-02-17 2 views
6

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

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

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

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

+0

Что значит «нормальная точка выхода» *. Если цели не завершены, которые были нацелены, то как это может быть нормальным? Можете ли вы более подробно объяснить, что вы пытаетесь выполнить, чтобы мы могли понять, что именно вам нужно? –

ответ

7

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

<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> 
+1

Это действительно пятно, но не работает для меня с помощью msbuild 4.0. Выполнение возвращается к цели, которая использовала CallTarget и продолжает (так что «Build continue» также будет напечатана на экране). Есть ли обходные пути, которые вы могли бы предложить? – charisk

+0

Я обновил свой ответ, теперь он должен работать лучше. –

+0

Спасибо. Но теперь нет цели для выхода. Если специальное условие не выполняется, мы переходим к цели Continue, иначе мы остаемся в BuildProcess (который должен только закончиться там). – charisk

2

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

Так что если у вас есть сценарий с мишенью, как это:

<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> 
0

В конце концов нашли элегантное решение подобной проблемы. Мне просто нужно было перефразировать мою озабоченность с "Выполнение прерывания/прерывания 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 цель была выполнена.

Смежные вопросы