如何在不引发错误的情况下停止MSBuild执行?

时间:2010-02-17 21:03:37

标签: msbuild

使用MSBuild,一旦发生错误,除非ContinueOnError=true,否则项目的执行将被停止。

有没有办法在不引发错误的情况下停止项目的执行?

我想有这种可能性,因为我有一组现有的msbuild项目文件,在某些情况下,我需要停止处理项目而不会引发错误,因为它是进程的正常退出点,而我不希望使用脚本的人认为某些事情是错误的。

我知道我可以设置一些属性并将所有剩余的任务置于此条件,但我想避免这种情况。

3 个答案:

答案 0 :(得分:9)

正如您解释的那样,您希望在特殊情况下停止构建而不会引发错误,因为它是正常的退出点。为什么不创建一个目标,不做任何可以作为退出点的目标。在您的特殊情况下,您将调用此目标。

<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 :(得分: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>

答案 2 :(得分:1)

最终为类似问题找到了一个优雅的解决方案。我只需要将“中断/中断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 目标执行后正确检查输入/输出。