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

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

WARNING: Error reading msbuild project information, ensure that your input solution or project file is valid. NETCore and UAP projects will be skipped, only packages.config files will be restored.

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

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

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

Контекст

В локальной сборке Azure Pipelines я запускаю задачу NuGet, чтобы восстановить пакеты для своего решения. Решение содержит как проекты, ориентированные на .NET Framework и использующие packages.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.
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 196
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

NuGet restore - how to make it treat warnings as errors?

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

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

This message is expected, but it should not block your restore.

In the future once msbuild provides a way to skip projects that are missing a target this message will go away: microsoft/msbuild#2471

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

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

Спасибо за ответ! У меня нет учетной записи на GitHub, и я всегда участвовал там только как читатель, но, возможно, пришло время это изменить. Я не знаю, что вы имеете в виду под «гаечным ключом» в последнем предложении, но я думаю, что понял общее значение, и я смогу продвинуть это вперед, как только сочту, что это достаточно важно, чтобы стоит усилий. Сожалеем, что NuGet недостаточно развит, чтобы иметь такую ​​возможность.

Palec 01.07.2019 08:46

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