15

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

我怎样才能改变这种行为,并让它在失败时停止?

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

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

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

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

有什么方法可以让 Visual Studio 2010(包括 Express 版本)在构建失败时停止构建?

4

4 回答 4

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>

将项目替换为您的项目,并且需要为 Clean 目标模仿该组。

我希望有更好的解决方案,但我不知道为什么 MSBuild 团队不会将此功能添加到产品中。就像你说的,Make 几十年前就想通了。FWIW,我不知道这与复杂的构建依赖关系和构建并行性有多好。

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

我希望这有帮助。

于 2011-03-02T03:54:57.977 回答
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/

于 2014-07-18T17:59:43.500 回答
0

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

这将立即停止构建过程。

于 2012-09-09T21:43:14.393 回答
0

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

于 2014-07-18T18:10:33.847 回答