如果文件存在,我该如何在MSBuild中引发错误?

41
我们有一个在每晚构建之前运行的进程。如果该进程失败,则会生成一个文本文件。我所需要做的就是检查该文件是否存在,如果存在,则引起MSBuild失败。
目前我已尝试了以下方法:
<CreateProperty Condition="Exists('C:\Process\Fail.txt')"
      Value="false">
  <Output TaskParameter="Value" PropertyName="ProcessTestPassed"/>
</CreateProperty>
<Message Text="Process did not pass" Condition="Exists('C:\Process\Fail.txt')" ContinueOnError="false" />

<ReadLinesFromFile File="C:\Process\Fail.txt"                  Condition="'$(ProcessTestPassed)'=='false'" ContinueOnError="false" >
  <Output TaskParameter="Lines" ItemName="FileContents" />
</ReadLinesFromFile>
<Message Text="FileContents: $(FileContents)"  Condition="'$(ProcessTestPassed)'=='false'" ContinueOnError="false" />

这将产生一次构建通过,输出如下:

Task "CreateProperty"
Done executing task "CreateProperty".
Task "Message"
  QAWizardProTestPassed did not pass
Done executing task "Message".
Task "ReadLinesFromFile"
Done executing task "ReadLinesFromFile".
Task "Message"
  FileContents: 
Done executing task "Message".

我知道上面的代码可能有点过头了,但我只需要一个能够工作的东西!我错过了什么?


5
我认为我找到了一个可以接受的解决方案: - dprice
那其实是一个很好的解决方案。 - Bruno Lopes
1个回答

60

正如@dprice在他的评论中所指出的那样,最佳解决方案是:

<Error Condition="Exists('C:\Process\Fail.txt')" Text="Process did not pass!" /> 

2
关于这个问题,关键在于你放置Error标签的位置。在我的情况下,我遇到了这个错误:错误:不再支持将<Error>标记作为<Project>元素的子级。将此标记放置在目标内,并将目标名称添加到<Project>元素的“InitialTargets”属性中 - knocte
它在像 https://msdn.microsoft.com/en-us/library/8b08t3s4.aspx 这样的 <Target> 下工作。(Msvs 2015) - crokusek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接