Восстановление NuGet - как сделать так, чтобы предупреждения воспринимались как ошибки? - PullRequest
0 голосов
/ 20 июня 2019

Из-за отсутствия .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 Ответ

1 голос
/ 20 июня 2019

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

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

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

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

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

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

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

...