如何创建面向 .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.0
、netcoreapp3.1
和netcoreapp3.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