VS 15.8.2 сломал инструменты сборки - отсутствует RuntimeIdentifier

Последнее обновление Windows нарушило всю цепочку сборки, и я немного растерялся в том, что вызывает ее.

У меня есть унаследованный проект, который является достоянием VS 2017 со значительным количеством проектов (winform, веб-веб-сайт, только Webapi).

Локально все работает отлично. Я могу просто построить их.

На сервере proejct начал сбой, и ошибка:

C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Microsoft\NuGet\15.0\Microsoft.NuGet.targets(186,5): Error : Your project file doesn't list 'win' as a "RuntimeIdentifier". You should add 'win' to the "RuntimeIdentifiers" property in your project file and then re-run NuGet restore.

C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Microsoft\NuGet\15.0\Microsoft.NuGet.targets(186,5): Error : Your project file doesn't list 'win' as a "RuntimeIdentifier". You should add 'win' to the "RuntimeIdentifiers" property in your project file and then re-run NuGet restore.

C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\Microsoft\NuGet\15.0\Microsoft.NuGet.targets(186,5): Error : Your project file doesn't list 'win' as a "RuntimeIdentifier". You should add 'win' to the "RuntimeIdentifiers" property in your project file and then re-run NuGet restore.

Process 'msbuild.exe' exited with code '1'.

я добавил

<RuntimeIdentifiers>win</RuntimeIdentifiers>

К ряду проектов. Без изменений. Я в недоумении, потому что сообщение об ошибке даже не говорит мне, какой проект.

Ответ 2

Хотя ответ @Señor CMasMas помог мне в прошлом, теперь я обнаружил (с момента установки .NET Core SDK v2.2 - не знаю, связано ли это с этим), но мне также необходимо закрыть и снова открыть Visual Studio. Так что для меня рецепт:

  • Чистый раствор
  • Удалить папки obj
  • Удалите папку .vs (необязательно, если вы получаете красные линии, но все в порядке)
  • Закройте и снова откройте Visual Studio
  • Затем построить

Ответ 3

Добавьте это: <RuntimeIdentifier>win</RuntimeIdentifier> в файл проекта, например, после элемента TargetFrameworkVersion. Убедитесь, что имя элемента в единственном числе. RuntimeIdentifiers с другой стороны используется в новом формате csproj

Ответ 4

RuntimeIdentifier должен выглядеть примерно так, как описано здесь: https://docs.microsoft.com/en-us/dotnet/core/rid-catalog.

Учитывая, что это похоже на то, что вы просто локально находите, я бы разложил.csproj на вашем локальном компьютере против того, что было на вашем сервере сборки. Что-то мне подсказывает, они не идентичны.

FWIW, строка 186 в указанном файле Microsoft.NuGet.targets, запускает задачу ResolveNuGetPackageAssets, и вы можете увидеть, что аргумент RuntimeIdentifier передается как свойство NuGetRuntimeIdentifier. Вероятно, вы можете вернуться к этому в своем рабочем журнале диагностики построения, чтобы узнать, как он назначен.

Но, учитывая, что это работает на одном поле, а не на другом, я просто проверял файлы проекта и проверял, что тег RuntimeIdentifier идентичен в обеих системах.

С уважением,

Ответ 5

У меня похожий случай. Я пытаюсь создать решение с помощью msbuild, не устанавливая Visual Studio 2017, просто установите последнюю версию инструментов сборки vs 2017. Вот мои шаги:

  1. dotnet restore a.sln (В этом решении есть несколько проектов .Net Standard Library, остальные - проекты .NET 4.7.2).
  2. вызовите msbuild.exe, чтобы построить это решение.
  3. Я получил ошибку "отсутствует RuntimeIdentifier".

Ваш файл проекта не перечисляет "win" как "RuntimeIdentifier". Вы должны добавить 'win' к свойству "RuntimeIdentifiers" в файле проекта, а затем повторно запустить восстановление NuGet.

Кажется, проблема в старой версии Nuget. Пожалуйста, обратитесь сюда. Наконец, я решил это с помощью пакетов восстановления с последней версией Nuget (v5.0.2). шаги:

  1. Удалить папки obj и bin
  2. nuget.exe восстановить a.sln
  3. вызовите msbuild.exe

Ответ 6

Или вы можете просто запустить в корневом каталоге вашего проекта скрипт в PowerShell, который вы должны запускать от имени администратора.

Get-ChildItem .\ -include bin,obj -Recurse | foreach { remove-item $_.fullname -Force -Recurse }

этот скрипт удалит все папки obj и bin

Ответ 7

Для меня это было так же просто, как собрать приложение IoT для Windows с платформой x86 вместо ARM.

Ответ 8

В моем случае это происходило в сборке Azure.

Мне удалось решить эту проблему, заставив сборку использовать инструменты Visual Studio 2019.

Я изменил наш build.cake файл, чтобы шаги MSBuild включали UseToolVersion для VS 2019, например:

     MSBuild(_solutionFile, settings => settings.SetConfiguration(_configuration)
         .UseToolVersion(MSBuildToolVersion.VS2019));

Ответ 9

У меня была похожая проблема. Моя ошибка была

ошибка: ваш файл проекта не перечисляет "win10" как "RuntimeIdentifier". Вы должны добавить "win10" к Свойство "RuntimeIdentifiers" в файле проекта, а затем повторно запустите Восстановление NuGet.

Что ж, оказалось, что мне просто нужно было изменить цель сборки с "Любой процессор" на что-то другое (например, x64)...