检测到软件包降级警告(dotnet core, vs 2017)

123

我刚刚为我的解决方案(dotnet core 1.1 项目)更新了所有的NuGet包。

现在我遇到了以下警告,但我并不知道它们是什么意思。

NETStandard.Library downgrade warning


更新: 我仍然收到上述警告。我的Web项目警告Microsoft.NETCore.App包(见下图),而我的库项目警告NETStandard.Library(见上图)

Microsoft.NETCore.App downgrade warning

尝试在NuGet包管理器中更新Microsoft.NETCore.App时,我遇到了以下错误:

NuGet upgrade error

希望有人能够帮助我消除这些警告并设置好一切,以便我可以更新所有的包。


你能发布一下你的.csproj文件的内容吗? - Drew Noakes
22个回答

73

在打开一个现有的解决方案时,我遇到了一种情况,错误代替了警告。

我打开了YourAwesomeApp.csproj文件,并逐个检查“检测到包降级”错误,手动将该行项目的版本从现有版本更改为错误中显示的指定版本。

例如,如果错误提示检测到“SqlServer 1.0.4 -> 1.0.3”,则找到Sql Server软件包的行并将版本从1.0.3更改为1.0.4。

构建项目后,这些错误应该会消失。

不过,这种方法存在缺点:这一次我只有5个错误,但是如果另一个人的项目中有50个这样的错误,那么手动编辑这些行将会非常乏味和耗时。


7
当我在编译失败的项目上执行了 dotnet restore 后,这对我有效。 - Aage
4
对我来说起作用了,但必须执行“清理解决方案”然后进行构建。 - Neville
1
检测到包降级:Microsoft.Extensions.Logging从3.1.3降级到2.2.0。直接从项目引用包以选择不同的版本。当我搜索Microsoft.Extensions.Logging时,没有发现任何内容。 - Gopi
在一个解决方案中的一个项目中,我收到了这个消息,而降级版本则在一个被引用的项目中。我将被引用的项目的包升级到与引用项目相同的版本。 - undefined

65

通常情况下,这是因为您尝试安装的项目需要比您已经包含在项目中的子依赖项更高版本的依赖项。

解决方案是在安装软件包之前更新或删除项目中现有的依赖项。

示例:

检测到软件包降级:从9.0.0降级为8.0.0的Newtonsoft.Json。

这意味着您的项目中已经列出了Newtonsoft.Json 8.0.0作为一个依赖项,但您正在尝试安装的软件包至少需要版本9.0.0作为依赖项。

原因是Visual Studio不会自动升级此依赖项,因为您为项目指定了一个明确的版本。您可以将项目中的依赖项升级到最低要求的版本,也可以将其从项目中删除,并让您正在安装的软件包处理它。

要解决此问题,在上面的示例中,这意味着找到“Newtonsoft.Json 8.0.0”并将其升级到“9.0.0”版本,或者在安装软件包之前将其从项目中删除。


27
根据上面的答案,有效的解决方法是从您的csproj文件中删除以下行。

Web应用程序项目:

<RuntimeFrameworkVersion>1.0.4</RuntimeFrameworkVersion>

Lib项目:

<NetStandardImplicitPackageVersion>1.6.0</NetStandardImplicitPackageVersion>

20
在我的情况下,这些属性都没有在我的csproj文件中设置。我不得不告诉VS通过NuGet更新这些包。在从1.0移动到1.1后,当我解决了对隐式依赖.NETCore.App的显式引用的警告后,这些警告出现了。
更新于21/09/17:这似乎也会影响升级到2.0,解决方案也是相同的。使用NuGet手动更新这些包。感谢IbrarMumtaz指出这一点!

这正发生在我身上,从1.1升级到2.0。 - IbrarMumtaz
最好明确设置软件包版本,而不是忽略警告或尝试其他更通用的解决方案。如果您想避免降级,请明确说明。这是最好的答案。 - Dan Field
8
除非NuGet不允许你这样做,否则就会很困难。 令人崩溃的。 - Oliver

18

我能够通过在 cproj 中添加 NoWarn 来解决一些类似的错误

<Project Sdk="Microsoft.NET.Sdk">

 <PropertyGroup>
    <NoWarn>$(NoWarn);NU1605</NoWarn>
  </PropertyGroup>

...
</Project>

在多个软件包升级期间,您可能只想暂时添加它,然后稍后再将其删除。


4
唯一的问题是,“暂时”不可避免地会变成永久性的。无论是修改者忘记改回来还是没有记录下来并将维护工作转交给其他人,后者可能从一开始就不知道这个临时解决方案的存在。或者他们从未有时间处理它,最终它会消失在时间的迷雾中,毫无改变。 - Simon Elms

12

我通过从 csproj 文件中删除 <NetStandardImplicitPackageVersion> 元素来消除项目中的这些警告。

关于隐式元包的一些信息,请参考 这篇文章,它似乎是这个问题的根本原因。

你可能还需要更新一些依赖项。例如,我不得不将 BenchmarkDotNet0.10.1 升级到 0.10.3,以消除一些类似于你看到的警告。


8

尝试移除以下内容

<IsPackable>false</IsPackable>

从您的项目文件中获取-这是我成功的方法!

如果您仍然遇到 NU1605 错误代码,可以通过将以下内容添加到您的项目文件来忽略它:

<PropertyGroup>
    <NoWarn>NU1605</NoWarn>
</PropertyGroup>

我使用了nowarn解决方案,以便能够将最新的3.1.0-preview4.19579.2发布到Azure Web应用程序。 - Magnus Karlsson
是的,只要您在构建过程中忽略此特定警告,这将起作用 :) - Emil

5
  1. 识别检测到的包。例如,在我的情况下,它是 System.Diagonistics.DiagonsticSource 输入图像描述

  2. 从您的项目中找到此程序集引用的位置 (引用>属性>路径) 输入图像描述

  3. 复制路径并检查。在我的情况下, 项目正在引用4.6.0,但我即将安装的程序集需要5.0.0版本的 System.Diagonistics.DiagonsticSource作为最低要求

enter image description here

  1. 前往项目的NuGet包管理器,搜索"System.Diagonistics.DiagonsticSource"并更新。请注意,这可能会导致另一个"检测到包降级"错误(如果发生这种情况,请返回第一步)
    在此输入图片描述

  2. 现在,安装最初想要安装的程序集(在我的例子中是Microsoft.ApplicationInsights)


5

尝试使用NuGet

我遇到了以下问题:

错误 NU1605:检测到软件包降级:System.Net.NameResolution 从4.3.0降级到4.0.0。直接从项目中引用软件包以选择不同的版本。

所以我通过运行以下命令(在项目文件夹中)来引用软件包目录:

dotnet add package System.Net.NameResolution

请参考NuGet 错误 - NU1605

问题:

一个依赖包指定了一个更高版本的包的版本约束,而还原最终解析的版本低于其限制。也就是说,在解析包时,“最近者获胜”的规则可能会导致图中较近的包覆盖了远处的包。

解决方法:

为您想要使用的较高版本的包添加项目的直接引用。


3
在我的情况下,这个错误与.NET Core无关,而是与.NET Standard有关。
我有两个库A和B。库A依赖于一些NuGet包X,库B依赖于A。当我将X升级到一个新版本时,它不知何故开始依赖于NETStandard.Library NuGet包的一个新版本(从2.0.2升级到2.0.3),这导致B的构建出现错误:检测到包降级:从2.0.3降级为2.0.2的NETStandard.Library。从项目中直接引用该包以选择不同的版本
一旦我将NETStandard.Library NuGet包作为B的依赖项添加进来(显然是针对最新版本2.0.3),错误就消失了,即使出现了一个新的警告:
/usr/local/share/dotnet/sdk/2.1.403/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.DefaultItems.targets(5,5): 警告 NETSDK1023: 您的项目中包含了对 'NETStandard.Library' 的 PackageReference。该包已经被 .NET SDK 隐式引用,通常情况下您不需要从项目中引用它。更多信息请参见https://aka.ms/sdkimplicitrefs (NETSDK1023) (GWallet.Frontend.XF)

我按照你的说明更新了项目“B”,但对我没有起作用。不过还是谢谢你,这让我有些理解去寻找其他解决方案。 - Pajri Aprilio
请将以下与编程相关的内容从英文翻译成中文。只返回翻译后的文本:请将您的解决方案作为新答案发布 - knocte
仍未找到。但我正在尝试先移除A和B之间的依赖关系,然后使A和B依赖于相同版本的X,然后再次添加A和B之间的依赖关系。 - Pajri Aprilio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接