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

问题描述

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

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

但我也希望用户能够在不需要时卸载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 实际上是一个相当小的库,所以这个解决方案感觉有点“过度设计”。

解决方法

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

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

rohit21agrawal 给出了以下接近的理由:

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

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

也许您的问题是“强案”

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


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

light bulb menu