VS 15.8.2打破了构建工具 - 缺少RuntimeIdentifier

43 visual-studio-2017 visual-studio-2017-build-tools

最后一次Windows更新打破了整个构建链,我对它的原因有点不知所措.

我有一个遗留项目,这是一个带有大量项目的VS 2017解决方案(winform,基于Web,仅限一些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'.
Run Code Online (Sandbox Code Playgroud)

我已经添加了

<RuntimeIdentifiers>win</RuntimeIdentifiers>
Run Code Online (Sandbox Code Playgroud)

到了很多项目.没变.我很茫然,因为错误信息甚至没有告诉我哪个项目.

Señ*_*Mas 77

在尝试构建之前的某个时刻,您需要删除obj文件夹.不止一个人表明了解决问题的方法.

https://developercommunity.visualstudio.com/content/problem/312180/projects-fail-to-build-in-1580-due-to-errors-from.html

  • 在解决方案中删除我每个项目中的obj文件夹,对我来说都消除了此错误。 (6认同)
  • 当我将 .NET Framework 样式项目升级到新的 SDK 样式项目格式时,我遇到了这个问题,但我必须在没有更新项目的不同分支上工作。我认为“clean”应该删除 bin 和 obj 中的内容,但手动删除 obj 文件夹才是最终解决问题的方法。 (5认同)
  • 没有。不是。我对整个文件夹树进行了核武器攻击 - 甚至必须在每个构建上都进行完整的 git 获取。没有构建。 (4认同)
  • 我也有与VS 15.9.9相同的错误。该问题仅在devenv命令行中出现。不通过VS GUI。 (3认同)
  • 作为将来的参考,这可能是由于移至PackageReference并返回而导致残留。开放问题:https://github.com/dotnet/project-system/issues/3164 (3认同)
  • 在一种情况下,这对我有用,当时我将一个项目更新为新的 SDK 格式,然后切换到 git 中没有该更新格式的分支。切换分支后删除 obj 文件夹修复了它。但是,我有另一个项目已迁移为使用 PackageReference,并且在构建迁移的项目时遇到相同的错误。在第二种情况下删除 obj 没有帮助。 (2认同)

oza*_*mut 20

我在 Vs 2019 (16.8.6) 中遇到了同样的错误,以下步骤解决了我的问题。

  1. 关闭视觉工作室(可能保留其他视觉工作室实例)
  2. 删除解决方案中所有项目中的所有binobj文件夹
  3. 重新打开解决方案并构建

注意,如果bin文件夹存在,只删除obj文件夹是不行的,还需要删除bin文件夹。


Out*_*ill 15

尽管@SeñorCMasMas的回答过去对我有所帮助,但我现在发现(由于安装了.NET Core SDK v2.2-dunno,如果有关系的话),我还需要关闭并重新打开Visual Studio。所以对我来说,配方是:

  • 清洁溶液
  • 删除资料obj
  • 删除.vs文件夹(可选,如果出现红线,但显示正确)
  • 关闭并重新打开Visual Studio
  • 然后建立

  • 我已将项目转换为新的 SDK 格式,构建它并回滚我的更改。然后我得到了这个`项目文件没有将'win'列为csproj旧格式的“RuntimeIdentifier”`错误。我已经删除了在使用新项目格式时创建的所有 `bin` 和 `obj` 文件,并且它再次开始编译。 (2认同)

llo*_*all 15

或者,您只需在项目的根目录中运行 PowerShell 中应该以管理员身份运行的脚本。

Get-ChildItem .\ -include bin,obj -Recurse | foreach { remove-item $_.fullname -Force -Recurse }
Run Code Online (Sandbox Code Playgroud)

此脚本将删除所有 obj 和 bin 文件夹

  • 好的。或者,`rm *\obj -Recurse -Force` 也可以 (2认同)

Bah*_*haa 11

将此添加<RuntimeIdentifier>win</RuntimeIdentifier> 到您的项目文件中,例如在element之后TargetFrameworkVersion。确保元素名称为单数。RuntimeIdentifiers另一方面以新的csproj格式使用

  • 这对我有用。我正在混合 .Net Standard 和 .Net Framework 项目。这是从命令行构建解决方案的所有 .Net *Framework* .csproj 文件所必需的。 (4认同)
  • 在我将项目迁移为使用 PackageReference 样式 nuget 的情况下,这对我有用。 (2认同)
  • 为什么它然后在 Visual Studio 中构建并从命令行中的 msbuild 构建..但在 azure 中中断? (2认同)
  • 我将复数版本 &lt;RuntimeIdentifiers&gt;win-x64;win-x86&lt;/RuntimeIdentifiers&gt; 添加到 .NET 项目文件中,并且它有效。 (2认同)
  • 我在 Azure Devops 中的 Windows 最新代理上添加了如上所述的单数,以混合 .net 标准和 .net 6 程序集以及 .net 框架。为我修好了。非常感谢。 (2认同)

sti*_*ijn 9

通过运行手动恢复包时,在使用 packageReference 的项目中遇到此问题

NuGet.exe restore my.sln
Run Code Online (Sandbox Code Playgroud)

作为 TeamCity 构建的一部分(因此可能与 nf313743 的答案相关/sf/answers/4266584871/),然后使用 msbuild 构建项目。当 msbuild 开始处理 PackageReference 时,这将导致以下错误:

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

删除 obj 目录等在这里不起作用,因为它们是通过restore步骤添加的;添加 RuntimeIdentifier 可能会起作用,但在 VS2017 命令行上构建完全相同的内容可以正常工作,因此很明显,区别在于 TeamCity 设置环境的方式。

罪魁祸首可以在第一次调用的输出中找到:

NuGet.exe restore my.sln -NonInteractive
MSBuild auto-detection: using msbuild version '16.10.2.30804'
from 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\bin'.
Run Code Online (Sandbox Code Playgroud)

它使用 VS2019 安装中的 msbuild,而该项目是由 VS2017 构建的,因此在混合这些内容时会出现不兼容性,这并不意外。不管怎样,关键是 TeamCity 可能没有像 VS2017 命令行那样设置完整的环境,并且 NuGet 文档说

By default the MSBuild in your path is picked,
otherwise it defaults to the highest installed version of MSBuild.
Run Code Online (Sandbox Code Playgroud)

这就是为什么它使用 VS2019 的原因。解决方案是手动传递-MsBuildPath给 NuGet 并将其设置为与 teamCity 中所选构建工具对应的内容,在本例中:

NuGet.exe -msBuildPath "%MSBuildTools15.0_x86_Path%" restore my.sln
Run Code Online (Sandbox Code Playgroud)

(事实证明 teamCity 本身在其自己的 NuGet 步骤中也受到此问题的困扰:How to set the MSBuild version for TeamCity NuGet Installer?

  • @stjin:你是我的英雄!在我的多目标解决方案中,包含“net48”/“net5.0-windows”组合项目以及仅限“net48”的项目(其中一个是不可更新的非 SDK 项目),这是唯一适用于我的 Azure 的解决方案管道:使用“NUGET RESTORE”而不是“DOTNET RESTORE”并指定“-MSBuildPath”(必须指向 MSBuild.exe 所在的文件夹,而不是 exe 本身)。 (2认同)

Sim*_*ier 6

我有类似的问题。我的错误是

错误:您的项目文件未将“win10”列为“运行时标识符”。您应该将“win10”添加到项目文件中的“RuntimeIdentifiers”属性,然后重新运行 NuGet 还原。

好吧,事实证明我只需将构建目标从“任何 CPU”更改为其他内容(例如 x64)...


小智 6

您必须弄清楚解决方案中的哪些项目会触发此错误。如果您查看错误面板,您可以找到它。转到该项目位置并删除 bin 和 obj 文件夹。然后重建。应该没问题


Ice*_*Liu 5

我有一个类似的案例。我尝试通过 msbuild 构建解决方案,而不安装 Visual Studio 2017,只需安装最新版本的 vs 2017 构建工具。这是我的步骤:

  1. dotnet Restore a.sln(此解决方案中有一些.Net标准库项目,其他是.NET 4.7.2项目)。
  2. 调用 msbuild.exe 来构建此解决方案。
  3. 我收到“缺少运行时标识符”的错误。

您的项目文件未将“win”列为“RuntimeIdentifier”。您应该将“win”添加到项目文件中的“RuntimeIdentifiers”属性,然后重新运行 NuGet 还原。

这似乎是旧版本 Nuget 中的一个问题。请参考这里。最后,我通过使用最新的Nuget(v5.0.2)恢复包解决了这个问题。步骤:

  1. 删除obj和bin文件夹
  2. nuget.exe 恢复 a.sln
  3. 调用msbuild.exe

  • 将 nuget.exe 从 v4.9.4.5839 升级到 v5.4.0.6315 为我解决了这个问题。 (2认同)