如果一个项目无法构建,默认情况下,Visual Studio 会继续尝试构建依赖于该项目的所有其他项目,因此会产生愚蠢的错误,因为其他项目是现在正在建立一个陈旧版本的二进制文件。
如何更改此行为,并让其在失败时停止?
例如,假设我有一个名为MyApp.Core的库项目,以及一个名为MyApp的可执行项目。 MyApp在MyApp.Core中调用一个方法。假设我向该方法添加了一个新参数,然后尝试构建,但我无意中在MyApp.Core中引入了一个不相关的编译器错误。当我构建时,Visual Studio将:
Make自1977年以来已经解决了这个问题:当它意识到它无法构建时,停止构建。我使用过的每个其他构建系统和IDE也是聪明到足以阻止失去的原因。但Visual Studio还没有完全赶上1977年的技术复杂性。
本书“Visual Studio Hacks”在其宏部分中有一个解决方法:您可以编写一个宏,在项目完成构建时触发;如果项目的构建状态为“失败”,则宏可以发出“取消构建”命令。我经常在我使用Visual Studio的每台计算机上安装此hack。但是,在家里我使用Visual C#Express,它不支持宏。
有没有办法让Visual Studio 2010(包括Express版本)停止构建失败?
答案 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)
当我看到它发生时,我总是按住“暂停/中断”键并取消构建。