我维护了许多使用JSON和/或SQL Server的nuget程序包。
当前,它们依赖于Newtonsoft.Json
和System.Data.SqlClient
,但是我收到了支持System.Text.Json
和Microsoft.Data.SqlClient
的请求。更新代码很简单,但是nuget包应该怎么做?
有了新的主要版本,我不需要更新所有相关的软件包,但是更新可能会使用户感到困惑(例如Newtonsoft.Json
用户不得更新主要版本)。
新软件包使它更清晰,但我不确定如何命名。特别是如果一个程序包同时依赖JSON和SQL Server(即3个新程序包)
例如,我尝试搜索nuget.org,但未找到任何内容。
对于这种情况是否有建议或最佳做法?
答案 0 :(得分:1)
一种选择是,在程序包本身中不包含任何依赖项,而是将常见行为提取到接口中,并允许调用方注入自己的实现。这样,消费者可以选择他们喜欢的任何依赖项。
一个很好的例子是ILogger
接口-库使用该接口记录日志,调用者可以选择注入他们喜欢的任何实现(例如,来自Serilog
或log4net
的实现)。
缺点是,如果没有满足您需求的现有接口,则需要提供一个接口(以及可能的实现方式,每个依赖项打包一个接口,以便消费者可以混合使用)。
这是一个重大突破,因此,我考虑使用新的程序包名称和名称空间进行操作,并弃用您现有的程序包。
可以使用包名称中的依赖项,但是会出现组合爆炸。 Common.Logging
使用这种方法,但还必须在名称中包含deps的版本号,这会使爆炸更加严重(讨论here的原因)。
仅仅颠覆主要版本听起来像一场噩梦,尤其是当人们可能想要选择较低版本中的依赖项时。