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