添加新的依赖项是否会影响二进制兼容性,只要库的外部API以其他方式向后兼容?
我的CBOR library包含任意精度算术的类(在PeterO命名空间中)。 (它在C#和Java中; Java版本在一个单独的存储库中,但同样的问题适用于这两个版本。)
我已将这些类移动到新的命名空间(在PeterO.Numbers中),并重命名它们(保留原始类以实现向后兼容),因为它们现在的命名空间只包含实用程序类。我计划将新类移动到一个单独的库,并使CBOR库将该库作为依赖项调用,因为任意精度类在CBOR之外显然是有用的。 (我计划最终弃用旧类。)
但是我担心如果以这种方式创建一个单独的库是一个二进制兼容性问题,这样我不仅可以更新次要版本,还可以更新主要版本。在撰写本文时,CBOR库是版本2.3.1。我可以这样做并将版本更改为2.4,或仅更改为3.0?
答案 0 :(得分:8)
只要你开始使用界面开始和你的所有图书馆'客户知道那个界面,你会没事的。只要您的库具有其客户端理解的接口并且它实现了接口,您的代码驻留在库中或库外的库中无关紧要。
这是一个古老的问题,15年前由COM(组件对象模型)解决了。保持你的界面与实现分开,你是金色的。
答案 1 :(得分:7)
我会回答Java版本。 This section of the Java Language Specification详细描述了在保留二进制兼容性的同时可以对应用程序进行的更改。
据我所知,您的更改(尽管它们可能影响源的很大一部分)是简单的重构,它将一些实用程序类暴露给另一个模块,并重新引导旧类来调用这个新模块。这在Evolution of Packages:
一节中有所描述新的顶级类或接口类型可以添加到包中,而不会破坏与预先存在的二进制文件的兼容性,前提是新类型不会重用先前为不相关类型指定的名称。
因此,这不会破坏与使用您的库的现有类的二进制兼容性。以前调用CBORClient
的任何现有类CBORUtil.doArithmetic()
将继续工作而无需重新编译它,因为该方法仍然存在,只有其主体已更改为调用另一个模块进行计算
答案 2 :(得分:3)
最好避免在下一个主要版本之前添加新的依赖项。在此之前,在内部添加更改并使用相同的类创建新的任意精度库并同步它们而不依赖。
因此对于版本2.4添加新命名空间中的更改并从旧类调用它们并为任意精度类创建另一个类库并将它们同步直到CBOR库的下一个主要版本