诊断消息的 MSBuild 和 Visual Studio 格式

执行输出某些文本的工具时,MSBuild 会检查文本中的错误和警告。 许多工具使用已知格式来报告这些消息。 默认情况下,MSBuild 检查文本并根据输出报告错误和/或警告。 可以通过对 Exec 任务使用以下参数来增强或禁用此行为:IgnoreStandardErrorWarningFormatCustomErrorRegularExpressionCustomWarningRegularExpression

注意

如果决定使用自己的正则表达式来检测错误和警告,那么应知道 MSBuild 一次查看一行结果。 即使你的自定义正则表达式会跨多行匹配某些内容,但由于 MSBuild 处理文本的方式,该表达式也不会以这种方式运行。

查看以下四条消息,这些消息格式正确,可由 MSBuild 和 Microsoft Visual Studio 识别:

Main.cs(17,20): warning CS0168: The variable 'x' is declared but never used
C:\dir1\strings.resx(2) : error BC30188: Declaration expected.
cl : Command line warning D4024 : unrecognized source file type 'file1.cs', object . . .
error CS0006: Metadata file 'System.dll' could not be found.

这些消息符合此处显示的特殊五部分格式。 这些部分的顺序很重要,不应更改。

例如,

c1 : Command line warning D4024 : unrecognized source file type 'test.xyz'

Origin: c1
Subcategory: Command line
Category: warning
Code: D4024
Text: unrecognized source file type 'test.zyz'

此格式的每个组件描述如下:

  • Origin(必需) 源可以为空。 如果存在,则源通常是工具名称,例如其中一个示例中的 cl。 但它也可以是文件名,例如另一个示例中显示的“Main.cs”。 如果是文件名,则必须是绝对文件名或相对文件名,后跟可选的带括号的行/列信息,采用以下格式之一:

    (line) or (line-line) or (line-col) or (line,col-col) or (line,col,line,col)
    

    文件中的行和列从 1 开始;即一个文件的开头为 1,最左侧的列为 1。 如果 Origin 是工具名称,则不得根据区域设置进行更改;即它需要是区域中立的。

  • Subcategory(可选) 子类别用于进一步分类类别本身;它不应本地化。

  • Category(必需) 类别必须是“error”或“warning”。 大小写无关紧要。 与源一样,类别不得本地化。

  • 代码(可选) 代码标识特定于应用程序的错误代码/警告代码。 代码不得本地化,且不得包含空格。

  • Text 用于解释错误的用户友好文本,如果你适应多种区域设置,则必须对其进行本地化。

MSBuild 调用命令行工具(例如,csc.exevbc.exe)时,它会查看该工具向标准输出和标准错误流发出的输出。 任何符合前文所述的错误格式的行都将接受专门处理;也就是说,被识别为错误或警告的行将分别转换为生成错误和警告。 若要体验此操作的真正好处,必须在 Visual Studio 或 VS Code 等开发工具中进行生成。 由于 MSBuild 对这些消息进行专门处理,因此它们在 Visual Studio 任务列表中将记录为一级警告和错误。 如果 Origin 指定了行/列信息,则双击该消息会转到有问题的文件中的错误源。