如果一个项目无法构建,Visual默认情况下会继续尝试构建依赖于该项目的所有其他项目,因此会产生愚蠢的错误,因为其他项目现在是针对过时版本的二进制文件构建的。
我怎样才能改变这种行为,让它在失败时停止呢?
例如,假设我有一个名为MyApp.Core的库项目和一个名为MyApp的可执行项目。MyApp在MyApp.Core中调用一个方法。假设我向该方法添加了一个新参数,然后尝试构建,但我无意中在MyApp.Core中引入了一个无关的编译器错误。当我构建时,将:
自1977年以来,制作就已经解决了这个问题:当它意识到自己无法构建时,它就停止了建设。我使用过的所有其他构建系统和IDE都足够聪明,足以阻止失败的原因。但是Visual还没有完全赶上1977年技术的复杂程度。
"Visual Studio黑客“一书在其关于宏的一节中有一个解决办法:您可以编写一个宏,在项目完成构建时触发该宏;如果项目的构建状态”失败“,则该宏可以发出一个取消生成命令。我经常在使用Visual的每台计算机上安装此黑客。但是,在国内,我使用的是,它不支持宏。
有没有办法让Visual 2010 (包括Express版本)停止在构建失败的基础上构建?
发布于 2011-03-02 03:54:57
尽管我非常喜欢MSBuild,但在使用解决方案文件进行构建时(正如您已经发现的那样),并没有内置的方法来做到这一点。有了Resharper的分析,我发现现在编译器的错误对我来说非常罕见,所以我很少会遇到大量错误信息的问题。
在我以前的商店里,有人经常会把构建的内容加起来,这样就可以在一个60多个项目的解决方案中找到一个根项目,因此,许多人开始从命令行单独运行项目,就像运行个人Make文件一样。
如果您真的想以与前面提到的宏不同的方式处理这个问题,您可以构造一个外部msbuild文件,该文件单独执行项目并在运行之间检查错误。您必须保持构建顺序正确,并且需要从命令行运行它和/或向Tools菜单选项添加快捷方式。
下面是一个例子:
<?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团队不把这个特性添加到产品中。就像你说的,几十年前就想明白了。FWIW,我不知道如何处理复杂的构建依赖关系和构建并行性。
我对MSBuild的问题主要集中在ResolveAssemblyReferences和ResolveComReferences任务上,它们是大解决方案中构建过程中最慢的部分,有一个大型/复杂的项目依赖树(大型相对于至少30个项目)。
我希望这能帮到你。
发布于 2014-07-18 17:59:43
还有一个用于Visual 2010/2012/2013的免费扩展可以做到这一点。
StopOnFirstBuildError (下载)
http://visualstudiogallery.msdn.microsoft.com/91aaa139-5d3c-43a7-b39f-369196a84fa5
停止在Visual 2010中建立第一个错误(编写)
http://einaregilsson.com/stop-build-on-first-error-in-visual-studio-2010/
发布于 2012-09-09 21:43:14
您还可以使用任务管理器终止名为cl.exe的进程。可能有多个cl.exe进程--只杀死其中一个就足够了。
这将立即停止构建过程。
https://stackoverflow.com/questions/5155599
复制相似问题