当某些内容无法编译时,使Visual Studio(Express)停止编译

时间:2011-03-01 14:09:48

标签: visual-studio visual-studio-express build-error

如果一个项目无法构建,默认情况下,Visual Studio 会继续尝试构建依赖于该项目的所有其他项目,因此会产生愚蠢的错误,因为其他项目是现在正在建立一个陈旧版本的二进制文件。

如何更改此行为,并让其在失败时停止?

例如,假设我有一个名为MyApp.Core的库项目,以及一个名为MyApp的可执行项目。 MyApp在MyApp.Core中调用一个方法。假设我向该方法添加了一个新参数,然后尝试构建,但我无意中在MyApp.Core中引入了一个不相关的编译器错误。当我构建时,Visual Studio将:

  • 尝试构建MyApp.Core,并因编译错误而失败。磁盘上的MyApp.Core.dll保持不变,因为构建失败。
  • 继续尝试针对旧版本的MyApp.Core.dll构建MyApp,并报告编译器错误,因为它传递的参数多于旧DLL期望的方法。
  • 在“错误”窗口的顶部处报告第二批错误,从而很难找到实际问题。

Make自1977年以来已经解决了这个问题:当它意识到它无法构建时,停止构建。我使用过的每个其他构建系统和IDE也是聪明到足以阻止失去的原因。但Visual Studio还没有完全赶上1977年的技术复杂性。

本书“Visual Studio Hacks”在其宏部分中有一个解决方法:您可以编写一个宏,在项目完成构建时触发;如果项目的构建状态为“失败”,则宏可以发出“取消构建”命令。我经常在我使用Visual Studio的每台计算机上安装此hack。但是,在家里我使用Visual C#Express,它不支持宏。

有没有办法让Visual Studio 2010(包括Express版本)停止构建失败?

4 个答案:

答案 0 :(得分:3)

尽管我喜欢MSBuild,但在使用解决方案文件构建时没有内置的方法(正如您已经发现的那样)。通过Resharper的分析,我发现编译器错误对我来说非常罕见,所以我很少遇到压倒错误信息的问题。

在我之前的商店里,有人经常搞砸构建,以便在60多个项目的解决方案中有一个根项目,因此,许多人从命令行单独运行项目,类似于运行个人Make文件。

如果您真的想以与您提到的宏不同的方式处理此问题,您可以构建一个外部msbuild文件,该文件单独执行项目并检查运行之间的错误。您必须保持构建顺序正确,并且您需要从命令行运行它和/或添加工具菜单选项的快捷方式。

以下是一个例子:

 <?xml version="1.0" encoding="utf-8"?>
 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Build">
     <MSBuild ContinueOnError="false" Projects="log4net\log4net.csproj" Targets="Build">
          <Output TaskParameter="TargetOutputs" ItemName="BuildOutput"/>
     </MSBuild>
     <MSBuild ContinueOnError="false" Projects="Project1\Project1.csproj" Targets="Build">
          <Output TaskParameter="TargetOutputs" ItemName="BuildOutput"/>
     </MSBuild>
     <MSBuild ContinueOnError="false" Projects="Project3\Project3.csproj" Targets="Build">
          <Output TaskParameter="TargetOutputs" ItemName="BuildOutput"/>
     </MSBuild>
    </Target>
   <!-- <OnError ExecuteTargets="ErrorTarget" /> //-->
  </Project>

将项目替换为您的项目,并且需要模拟该组以清除目标。

我希望有更好的解决方案,我不知道为什么MSBuild团队不会将此功能添加到产品中。就像你说的那样,Make几十年前就已经弄明白了。 FWIW,我不知道它如何与复杂的构建依赖关系一起工作并构建并行性。

我的MSBuild问题围绕ResolveAssemblyReferences和ResolveComReferences任务,它们是一个大型/复杂项目依赖树(大到至少相对于30个项目)的大型解决方案中构建最慢的部分。

我希望这会有所帮助。

答案 1 :(得分:2)

Visual Studio 2010/2012/2013还提供了这个免费扩展程序。

StopOnFirstBuildError (下载)

http://visualstudiogallery.msdn.microsoft.com/91aaa139-5d3c-43a7-b39f-369196a84fa5

在Visual Studio 2010中的第一个错误上停止构建(写作)

http://einaregilsson.com/stop-build-on-first-error-in-visual-studio-2010/

答案 2 :(得分:0)

您还可以使用任务管理器终止名为cl.exe的进程。可能有多个cl.exe进程 - 只杀死其中一个进程就足够了。

这将立即停止构建过程。

答案 3 :(得分:0)

当我看到它发生时,我总是按住“暂停/中断”键并取消构建。