【问题标题】:How to create NuGet package that targets .NET 5 or below. But not .NET 6 or above如何创建面向 .NET 5 或更低版本的 NuGet 包。但不是 .NET 6 或更高版本
【发布时间】:2021-11-09 13:57:11
【问题描述】:

我有一个场景,应该允许在 .NET 5 或更低版本的项目上引用 nuget 包。但不适用于 .NET 6 及更高版本。

原因是,my library 在 .NET 5 之前有效,但在 .NET 6 中中断。虽然我已经记录了它,但我想防止用户安装错误的版本。我们有办法做到这一点吗?

更清晰的场景:

  • 我的库有一个版本v1.5.0,它具有多个目标net5.0netcoreapp3.1netcoreapp3.0。我了解此版本可用于即将推出的 .NET 版本。
  • 当 .NET 6 出现时,v1.5.0 崩溃了。它在 .NET 6 中不起作用
  • 现在我修复了这些问题并为 .NET 6 发布了 v1.7.0。这次它只针对 net6.0(不是针对较低版本的多目标。由于维护原因。)。
  • 因此,.NET 5 用户将继续使用 v1.5.0,而 .NET 6 用户应该使用 v1.7.0。我已经记录了每个 TargetFrameworks 的首选版本。
  • 现在,任何与 .NET 5 及以下版本上的v1.5.0 相关的问题都将作为v1.6.x 发布。当我发布这些版本时,我想防止 .NET 6 的用户意外安装它。
  • 即使用户安装了错误的版本,并且在构建项目时,它也会抛出错误,提示他们应该将版本更新为v1.7.0(在构建时预防,而不是运行时)

【问题讨论】:

  • 如果你的包依赖Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation你可以指定一个上限

标签: .net-core nuget nuget-package .net-5 .net-6.0


【解决方案1】:

那是不可能的。 .NET 6(及更高版本)项目可以使用任何面向 .NET 5 的包。所以你没有在上面描述一个有效的场景。

【讨论】:

  • 嗨@lex-li,我编辑了这个问题,让你更清楚地了解这个场景。
  • @SoundarAnbu 您只能阻止 .NET 5 用户使用您的 v1.7 版本,但不能阻止 .NET 6 用户使用 v1.5。 “我已经记录了每个 TargetFrameworks 的首选版本”是您所能做的。
【解决方案2】:

正如 Lex Li 的回答所暗示的,当 net6.0 或更高版本的项目引用您的包时,NuGet 不提供包安装/恢复失败的方法。根据设计,相同目标框架标识符的更高版本被认为是兼容的。

但是你可以做的是在你的包中包含build/net6.0/<packageid>.targets,并有一个在构建之前/之后运行的目标,它使用<Error Message="..." /> 表示这个目标框架需要更高的包版本。如果您的包是项目中的传递依赖项,而不是直接引用,您可能还需要包含 buildTransitive/net6.0/<packageid>.targets 以确保它仍然有效。

【讨论】:

  • 谢谢!我会试试这个。
猜你喜欢
  • 1970-01-01
  • 2022-08-21
  • 1970-01-01
  • 2012-01-13
  • 2023-01-16
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多