如何创建面向 .NET 5 或更低版本的 NuGet 包。但不是 .NET 6 或更高版本

Posted

技术标签:

【中文标题】如何创建面向 .NET 5 或更低版本的 NuGet 包。但不是 .NET 6 或更高版本【英文标题】:How to create NuGet package that targets .NET 5 or below. But not .NET 6 or above 【发布时间】: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你可以指定一个上限 【参考方案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 以确保它仍然有效。

【讨论】:

谢谢!我会试试这个。

以上是关于如何创建面向 .NET 5 或更低版本的 NuGet 包。但不是 .NET 6 或更高版本的主要内容,如果未能解决你的问题,请参考以下文章

不支持在面向 .NET 5 或更高版本时直接引用 Windows 元数据组件

如何在 iOS 10 或更低版本中使用 webview? [复制]

iOS v10 或更低版本:如何以编程方式在导航栏底部添加 UISearchController

Django 1.3 或更低版本的 Django Admin 中的自定义过滤器

使用PHP检查浏览器IE8或更低版本

目标 .NET 4.0 但需要 .NET 4.5