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:将包依赖项显式列出为项目中的包引用,以便可以卸载它们的主要内容,如果未能解决你的问题,请参考以下文章