【发布时间】:2011-03-01 14:09:47
【问题描述】:
如果一个项目无法构建,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 版本)在构建失败时停止构建?
【问题讨论】:
-
我无法重现“在错误窗口顶部报告第二批错误,因此很难找到实际问题。” - 对我来说,类库错误总是出现在依赖项目之上。 (2010 年)
-
您使用的是哪个版本的 VS Express? (2005, 2008, 2010)
-
@Damien_The_Unbeliever:嗯。我的类库错误确实显示在底部。我想知道这是否是一个命名问题——我的实际项目名称是 Tendril (exe) 和 Tendril.Core (dll),所以它可能是按项目名称的字母顺序对错误进行排序?
-
@birryree:是的,我应该提到这一点——我编辑了问题以澄清我对 VS2010 的修复感兴趣。但这至少在 VS2003 和 VS2002 中就已经是一个问题了。
-
我很好奇,因为 VS2010 在 MSDN 上确实有一些实现这种行为的扩展,比如 this extension,但我不认为 VS2010 Express 可以安装那个,因为它(我认为)是一个编辑器扩展而不是模板扩展。但是,是的,我很惊讶这种行为不是实际 IDE 的一部分。
标签: visual-studio visual-studio-express build-error