【问题标题】:Stop MSBuild processing immediately on compilation errors在编译错误时立即停止 MSBuild 处理
【发布时间】:2011-07-15 18:52:04
【问题描述】:

我编写了一个批处理文件,执行时会构建一个 Visual Studio 解决方案。该解决方案包含几个 C# 项目。我正在为此使用 MSBuild 实用程序。当任何项目中存在编译错误时,如何阻止构建继续进行? 进一步如何获取错误消息并在命令提示符上显示它们?

【问题讨论】:

标签: msbuild batch-file command-prompt


【解决方案1】:

如果您发布了批处理文件的相关部分,那么给您答案会更容易。不过,对于问题的第二部分,这是一个示例,我如何在我们的一个构建脚本中解决几乎相同的问题:

msbuild.exe /m /p:Configuration=Release /v:n theSolutionFile.sln >Build.log
if ERRORLEVEL 1 goto :showerror
find "0 Warn" Build.log >nul:
if ERRORLEVEL 1 goto :showerror

goto :EOF

:showerror
echo Build error occurred
exit %ERRORLEVEL%

【讨论】:

  • Build.log 对我来说是一个空文件,这个答案可能已经过时了
  • @reggaeguitar:不,这并不过时。您是否在 VS 命令提示符下运行 msbuild.exe /m /p:Configuration=Release /v:n yourSolutionFile.sln 并检查会发生什么?
  • 我刚刚又测试了一遍,Build.log 文件是空的,但似乎编译得很好
  • @reggaeguitar:如果你按照我写的那样测试它(没有>Build.log),Build.log 文件肯定不会改变,你期望什么?但是,您应该首先尝试在 Visual Studio 中编译配置,那里的输出窗口应该包含与运行 msbuild 相同的输出。
  • 我用">Build.log"测试了它。我最初是试图找到一种方法来从 MsBuild 获取输出的方法,因为窗口立即关闭。我意识到这是一个单独的问题,如果可以的话,我会收回我的反对票。如果它实际上没有向文件写入任何内容,我看不到“>Build.log”的意义。
【解决方案2】:

在构建 Visual Studio 解决方案时不支持在第一次失败时停止。

您可以通过以下步骤解决此问题:

  1. 将环境变量msbuildemitsolution设置为1(set msbuildemitsolution=1);
  2. 调用 MSBuild 以从目标 VS 解决方案生成 *.proj 文件;
  3. 在生成的 *.sln.proj 文件中,将名为 Build 的目标中的 RunEachTargetSeparately="true" 更改为 RunEachTargetSeparately="false"
  4. 调用 MSBuild 以构建更新的 *.sln.proj 文件。

此答案基于Dan Moseley answer to a post on MSDN Forums

【讨论】:

  • 我在 .NET 4.0 中尝试过使用 msbuild。不工作,没有创建 .proj 文件,我通过 procmon 监视了 msbuild 活动并检查了磁盘文件。
  • .NET 4.0 仍然支持此功能;确保通过系统设置设置环境变量时没有打开命令提示符窗口,如果是这种情况,请打开一个新的命令提示符窗口。
  • 此答案不再适用于 Visual Studio 2017。#1) 此 env-var 将导致生成 .metaproj 文件而不是 .sln.proj 文件。 #2) 此文件不包含属性RunEachTargetSeparately,我在 .NET C# 项目和 C++ 中都对其进行了测试。 #3) 这个文件似乎没有任何适用的东西,因为它可以帮助防止在第一个错误发生后发生更多的构建。所有错误提及都与 NuGet 还原有关。
猜你喜欢
  • 1970-01-01
  • 2016-07-27
  • 2015-10-05
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
相关资源
最近更新 更多