NuGet:将包依赖项显式列出为项目中的包引用,以便可以卸载它们

Posted

技术标签:

【中文标题】NuGet:将包依赖项显式列出为项目中的包引用,以便可以卸载它们【英文标题】:NuGet: explicitly list package dependencies as package references in project so they can be uninstalled 【发布时间】:2021-04-20 12:28:25 【问题描述】:

我正在创建一个 NuGet 包(我们称之为 Lib),它还在单独的包中包含分析器 (Lib.Analyzers)。

默认情况下,我希望在安装Lib 时将Lib.Analyzers 安装到项目中。我可以通过在Lib 的依赖项中(在.nuspec 文件中)列出Lib.Analyzers 来实现这一点。

但我也希望用户能够卸载Lib.Analyzers 在他们不想要的时候再次。

AFAIK 包依赖项未在包管理器中作为单独的包列出,以下内容在包管理器控制台中不起作用:

PM> Install-Package Lib
...
PM> Uninstall-Package Lib.Analyzers
Uninstall-Package : Package 'Lib.Analyzers' to be uninstalled could not be found in project 'ClassLibrary1'

有没有办法做到这一点?我在docs 中找不到任何内容。

基本原理

我想尽量减少新用户的摩擦,即他们应该得到Lib.Analyzers 提供的帮助,而不必记住每次安装Lib 时都要安装分析器。

但我也希望 Lib.Analyzers 不会被强迫给可能不再需要他们的有经验的用户。

解决方法

我目前的解决方法是将Lib 重命名为Lib.Core,将其依赖关系删除为Lib.Analyzers,并创建一个名为Lib 的第三个元包,将两者捆绑在一起,得到以下依赖关系图:

Lib
|- Lib.Core
'- Lib.Analyzers

新用户将始终安装Lib,而有经验的用户只能安装Lib.Core

但是,Lib 实际上是一个相当小的库,所以这个解决方案感觉有点“过度设计”。

【问题讨论】:

【参考方案1】:

有一个关于可选依赖here的GitHub问题,已关闭。

所以很遗憾,目前不支持它,而且似乎将来也不支持。

rohit21agrawal 给出了以下关闭原因:

几个原因 - 我们正在关闭尚未激活的错误 一年多两年,这不符合我们的计​​划 NuGet 在不久的将来。

如果您对此功能有强有力的案例,您可以打开一个新问题 我们会考虑的。

也许您的问题是一个“强有力的案例”

话虽如此,您的解决方法似乎还不错。更多文档/介绍问题。


还有一个option to suppress specific analyzers,如果这是您问题的根源。

【讨论】:

啊,太糟糕了。感谢您找到相关问题。

以上是关于NuGet:将包依赖项显式列出为项目中的包引用,以便可以卸载它们的主要内容,如果未能解决你的问题,请参考以下文章

如何从服务器中删除 NuGet 包?

为什么在nuget.org上没有列出支持的包的框架?

您如何覆盖传递的 nuget 依赖项

显式设置 NuGet 包中定义的构建目标的顺序

TeamCity Build Server无法恢复nuget包

使用 FHIR nuget 包通过引用查找包中的资源