Формат MSBuild и Visual Studio для диагностических сообщений
При запуске средства, которое выводит текст, MSBuild проверяет текст на наличие ошибок и предупреждений. Многие средства используют известный формат для создания отчетов по таким сообщениям. По умолчанию MSBuild проверяет текст и сообщает об ошибках и (или) предупреждениях в зависимости от выходных данных. Это поведение можно дополнить или отключить с помощью следующих параметров задачи Exec
: IgnoreStandardErrorWarningFormat
, CustomErrorRegularExpression
и CustomWarningRegularExpression
.
Примечание.
Если вы решили использовать собственное регулярное выражение для обнаружения ошибок и предупреждений, необходимо помнить, что 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.
Эти сообщения соответствуют специальному формату из пяти частей, который приведен здесь. Порядок этих частей имеет важное значение и не должен меняться.
Origin
: : Subcategory
Category
Code
Text
Например,
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'
Каждый из компонентов этого формата описывается следующим образом:
Источник (обязательно) Источник может быть пустым. При наличии источника он обычно представляет собой имя средства, например
cl
, как показано в одном из примеров. Однако он также может быть именем файла, например Main.cs, как показано в другом примере. Если это имя файла, оно должно быть абсолютным или относительным, а после него должны указываться дополнительные сведения о строке или столбце, заключенном в скобке, в следующем виде:(line) or (line-line) or (line-col) or (line,col-col) or (line,col,line,col)
Строки и столбцы начинаются с 1 в файле; то есть начало файла — 1, и самый левый столбец — 1. Если исходное имя является именем средства, оно не должно изменяться в зависимости от языкового стандарта; то есть оно должен быть независимым и нейтральным.
Подкатегория (необязательно) Подкатегория используется для классификации непосредственно категории; подкатегория не локализуется.
Категория (обязательно) Категория должна иметь значение "Ошибка" или "Предупреждение". Регистр не имеет значения. Как и в случае с источником, категория не локализуется.
Код (необязательно) идентифицирует код ошибки, определенный приложением, или код предупреждения. Код не локализуется и не должен содержать пробелы.
Текст Понятный текст, объясняющий ошибку; его необходимо локализовать, если поддерживается несколько языковых стандартов.
Если MSBuild вызывает средства командной строки (например, csc.exe
или vbc.exe
), проверяются выходные данные, которые средство выпускает в стандартные исходящие потоки и стандартные потоки ошибок. Все строки, соответствующие формату ошибок, которые мы только что рассмотрели, будут обрабатываться специфическим способом; то есть строки, которые распознаются как ошибки или предупреждения, будут преобразованы в ошибки сборки и предупреждения сборки, соответственно. Чтобы максимально эффективно использовать эти возможности, необходимо выполнять сборку непосредственно в средстве разработки, таком как Visual Studio или VS Code. Поскольку MSBuild обрабатывает эти сообщения специфическим способом, они регистрируются как предупреждения и ошибки первого класса в списке задач Visual Studio. Если источник указывает сведения о строке или столбце, то двойной щелчок на сообщении позволяет перейти к источнику ошибки в файле, содержащем ошибку.