Восстановление NuGet - как сделать так, чтобы предупреждения воспринимались как ошибки?

Из-за отсутствия.NET Core SDK восстановление пакета выполняется только частично и пропускает проекты SDK.

ВНИМАНИЕ: Ошибка чтения информации о проекте msbuild, убедитесь, что ваше входное решение или файл проекта верны. Проекты NETCore и UAP будут пропущены, будут восстановлены только файлы packages.config.

Это всего лишь предупреждение, и nuget.exe завершает работу с кодом состояния 0, поэтому конвейер сборки продолжается и завершается ошибкой, что затрудняет поиск причины.

Поскольку это распространенная проблема в нашей среде, я хочу, чтобы это предупреждение воспринималось как ошибка. Вполне нормально (и даже желательно), если другие предупреждения также рассматриваются как ошибки.

Я знаю, что NuGet читает свойства MSBuild TreatWarningsAsErrors а также WarningsAsErrors, но мне не удалось использовать их из командной строки. Я попытался установить переменную среды NUGET_RESTORE_MSBUILD_ARGS в /p:TreatWarningsAsErrors=true, но хотя эта опция была передана внутреннему вызову MSBuild, она не повлияла на предупреждение, напечатанное nuget.exe. Я не нашел ни других подходящих параметров CLI, ни переменных среды.

контекст

В локальной сборке Azure Pipelines я запускаю задачу NuGet, чтобы восстановить пакеты для моего решения. Решение содержит как проекты, ориентированные на.NET Framework и использующие package.config, так и проекты, ориентированные на.NET Core, использующие PackageReference.

Агенты сборки не находятся под моим контролем. У некоторых установлена ​​правильная версия SDK, у некоторых - нет. Я использую задачу.NET Core SDK Installer для установки соответствующего SDK.

Из-за изменений в определении сборки или обновлении SDK в решении сборка может прерваться. В этом случае сообщение об ошибке является неясным, потому что оно исходит от VS Build, а не от шага сборки восстановления пакета, где лежит основная причина, но которая светится зеленым.

Внутри задачи NuGet (версия 2.*) выполняет nuget.exe (в настоящее время версия 5.0.2), которая, в свою очередь, выполняет MSBuild для выполнения части своей работы, связанной с PackageReference. Сбой MSBuild приводит к тому, что исключение NuGet.CommandLine.ExitCodeException генерируется, но перехватывается, регистрируется и отбрасывается. Прямо над предупреждением Warning_ReadingProjectsFailed, упомянутым выше, выводится трассировка стека:

NuGet.CommandLine.ExitCodeException: Exception of type 'NuGet.CommandLine.ExitCodeException' was thrown.
    at NuGet.CommandLine.MsBuildUtility.<GetProjectReferencesAsync>d__6.MoveNext()
 --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at NuGet.CommandLine.RestoreCommand.<GetDependencyGraphSpecAsync>d__52.MoveNext()
 --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at NuGet.CommandLine.RestoreCommand.<DetermineInputsFromMSBuildAsync>d__47.MoveNext()

Комментарий в верхней части предложения catch говорит:

                // At this point reading the project has failed, to keep backwards
                // compatibility this should warn instead of error if
                // packages.config files exist, but no project.json files.
                // This will skip NETCore projects which is a problem, but there is
                // not a good way to know if they exist, or if this is an old type of
                // project that the targets file cannot handle.

1 ответ

Решение

Восстановление NuGet - как сделать так, чтобы предупреждения воспринимались как ошибки?

Я боюсь, что мы не можем заставить его воспринимать предупреждения как ошибки в данный момент, потому что это поведение соответствует требованиям.

Я уже сообщал об аналогичной проблеме команде NuGet, и я получил следующий ответ:

Это сообщение ожидается, но оно не должно блокировать ваше восстановление.

В будущем, когда msbuild предоставит способ пропустить проекты, в которых отсутствует цель, это сообщение исчезнет: microsoft/msbuild#2471

Кроме того, собственность TreatWarningsAsErrors установлен для одного / всех предупреждений NuGet на уровне проекта, но выше предупреждение будет выдано, когда MSBuild/VS начнет читать файл проекта .csproj, Это причина, почему собственность TreatWarningsAsErrors не работал, хотя он был установлен.

Поскольку агенты сборки не находятся под вашим контролем, мы не можем установить требуемую версию.NET Core SDK непосредственно на агенте, добавить соответствующую возможность агенту и добавить требование для возможности в конвейер сборки. Кажется, мы должны добавить комментарий в microsoft/msbuild#2471, чтобы спросить, можем ли мы получить ключ для установки информации об ошибке или предупреждении.

Другие вопросы по тегам