Visual Studio 中的 .NET 6 项目提供更新 NuGet 包至 7.0.0 的选项。

14

我在VS 2022中有一个.NET 6 ASP.NET Core项目,想知道是否有一种方法可以不在我的NuGet更新列表中获取.NET 7包?还是我应该将NutGet包更新到7.0.X?什么是最佳实践?

NuGet package manager


我的 TFM 是 .net6.0-windows7.0,当我将包更新到 7.0.0 时,会出现警告:“{PackageName} 7.0.0 不支持 net6.0-windows7.0,并且未经过测试。考虑将您的 TargetFramework 升级到 net6.0 或更高版本。” 这个警告在 Visual Studio 和命令行中都存在。 - Scover
2个回答

5

由你决定是否升级。这些程序包只是以 V7.0.0 的名称发布的,因为它们与 .NET 7.0 一起发布。对于大多数(如果不是全部)的这些程序包,没有要求运行时必须是 .NET 7.0。只需将其视为该程序包的 V7.0 版本。您可以更新(甚至使用新功能)这些程序包,而不必更新应用程序的运行时。


3
恐怕 AspNetCore 需要相应的运行时。 - Guru Stron
1
@GuruStron 确实,你可能是对的。不幸的是,通常只能通过“尝试或错误”来确定,因为没有普遍适用的规则来确定哪些有效,哪些无效。手动查看依赖项(请参见其他答案)也很麻烦。 - PMF
1
没错,其实没有硬性规定。但这些年来我为自己总结了一个指导原则——至少对于 Web 项目而言(正如我在我的回答中所写的那样),针对发布新版运行时的包(通常是 Microsoft 的)——坚持使用与运行时相匹配的主版本号——这样就不需要考虑破坏性变更和其他类型的兼容性问题 =) - Guru Stron
1
我不确定那完全准确。至少在asp.net上,对net7.0有明显的依赖关系。为什么它们会出现在一个目标为.net 6的项目中呢?如果你真的尝试更新,它会可预测地失败:错误NU1202:包Microsoft.AspNetCore.Authentication.Google 7.0.2与net6.0(.NETCoreApp,Version=v6.0)不兼容。包Microsoft.AspNetCore.Authentication.Google 7.0.2支持:net7.0(.NETCoreApp,Version=v7.0)。 - Arian Kulp
@ArianKulp 确实,有一些情况是已知的,但即使在这种情况下,只有在尝试安装后才能确定。目前在搜索中过滤不兼容的软件包在技术上还不可能。 - PMF

5

检查对应包的依赖关系。例如,Microsoft.Extensions.DependencyInjection 7.0.0 指定了下一个受支持的框架和依赖项:

  • .NETFramework 4.6.2
    • Microsoft.Bcl.AsyncInterfaces (>= 7.0.0)
    • Microsoft.Extensions.DependencyInjection.Abstractions (>= 7.0.0)
    • System.Threading.Tasks.Extensions (>= 4.5.4)
  • .NETStandard 2.0
    • Microsoft.Bcl.AsyncInterfaces (>= 7.0.0)
    • Microsoft.Extensions.DependencyInjection.Abstractions (>= 7.0.0)
    • System.Threading.Tasks.Extensions (>= 4.5.4)
  • .NETStandard 2.1
    • Microsoft.Extensions.DependencyInjection.Abstractions (>= 7.0.0)
  • net6.0
    • Microsoft.Extensions.DependencyInjection.Abstractions (>= 7.0.0)
  • net7.0
    • Microsoft.Extensions.DependencyInjection.Abstractions (>= 7.0.0)

但是例如 Microsoft.AspNetCore.Authentication.JwtBearer 7.0.0 仅支持.NET 7(我猜测所有或几乎所有ASP.NET Core包的行为方式都是相同的):

  • net7.0
    • Microsoft.IdentityModel.Protocols.OpenIdConnect (>= 6.15.1)

因此,在理论上,您可以升级某些依赖项,但绝不能在不更新目标框架版本的情况下升级所有依赖项。一般情况下,我更喜欢将所有内容更新到下一个主要版本,或者什么都不更新(对于支持“绑定到运行时”版本控制的包)。


这显示了一个大问题,例如 Microsoft.Bcl.AsyncInterfaces 7.0.0:它在 NET 6 下也是必需的,但没有列为依赖项。因此,一切都可以正常构建,但在运行时失败,一旦需要该软件包,否则不需要。这意味着丑陋和不可预测的错误。或者到处都是令人讨厌的 MS.Bcl.AsyncInterfaces(可能还有其他的)引用。 - Erik Hart

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