如何处理具有不同依赖关系的nuget包?

时间:2020-03-08 17:17:03

标签: nuget sqlclient system.text.json

我维护了许多使用JSON和/或SQL Server的nuget程序包。

当前,它们依赖于Newtonsoft.JsonSystem.Data.SqlClient,但是我收到了支持System.Text.JsonMicrosoft.Data.SqlClient的请求。更新代码很简单,但是nuget包应该怎么做?

  1. 发布现有软件包的新主要版本
  2. 创建新包

有了新的主要版本,我不需要更新所有相关的软件包,但是更新可能会使用户感到困惑(例如Newtonsoft.Json用户不得更新主要版本)。

新软件包使它更清晰,但我不确定如何命名。特别是如果一个程序包同时依赖JSON和SQL Server(即3个新程序包)

例如,我尝试搜索nuget.org,但未找到任何内容。

对于这种情况是否有建议或最佳做法?

1 个答案:

答案 0 :(得分:1)

一种选择是,在程序包本身中不包含任何依赖项,而是将常见行为提取到接口中,并允许调用方注入自己的实现。这样,消费者可以选择他们喜欢的任何依赖项。

一个很好的例子是ILogger接口-库使用该接口记录日志,调用者可以选择注入他们喜欢的任何实现(例如,来自Seriloglog4net的实现)。

缺点是,如果没有满足您需求的现有接口,则需要提供一个接口(以及可能的实现方式,每个依赖项打包一个接口,以便消费者可以混合使用)。

这是一个重大突破,因此,我考虑使用新的程序包名称和名称空间进行操作,并弃用您现有的程序包。

可以使用包名称中的依赖项,但是会出现组合爆炸。 Common.Logging使用这种方法,但还必须在名称中包含deps的版本号,这会使爆炸更加严重(讨论here的原因)。

仅仅颠覆主要版本听起来像一场噩梦,尤其是当人们可能想要选择较低版本中的依赖项时。