Osgi API包的语义版本控制

Osgi API包的语义版本控制,osgi,versioning,semantics,backwards-compatibility,api-design,Osgi,Versioning,Semantics,Backwards Compatibility,Api Design,当从API包中版本为1.0.0的包开始时,在向该包添加新接口后,新版本应该是什么?制造商就兼容性做出以下声明: 显而易见,二进制兼容性在向后兼容性中起着重要作用。然而,向后兼容性也非常依赖于语义。如果接口的责任发生变化,它仍然可以是二进制兼容的,但不再是向后兼容的 同时 3.micro-微型部件中的差异不表示任何向后兼容性问题 一个新的接口不会导致其提供程序的任何类型的二进制不兼容—完全可以省略一个实现。这是否被认为是包语义的“向后不兼容”更改?这是否意味着新版本应为1.1.0?确实提到: 如果

当从API包中版本为1.0.0的包开始时,在向该包添加新接口后,新版本应该是什么?制造商就兼容性做出以下声明:

显而易见,二进制兼容性在向后兼容性中起着重要作用。然而,向后兼容性也非常依赖于语义。如果接口的责任发生变化,它仍然可以是二进制兼容的,但不再是向后兼容的

同时

3.micro-微型部件中的差异不表示任何向后兼容性问题

一个新的接口不会导致其提供程序的任何类型的二进制不兼容—完全可以省略一个实现。这是否被认为是包语义的“向后不兼容”更改?这是否意味着新版本应为1.1.0?

确实提到:

如果对公共API引入任何向后不兼容的更改,则必须增加主版本
X
X.y.z
|
X>0

如果添加新接口只是调用几个旧接口(现在链接到一个新操作中),则应将其视为语义向后兼容。

在这种情况下,增加一个小版本就足够了。

向包中添加接口至少是一个小改动(1.2.3->1.3.0),因为您破坏了API的提供程序(在OSGi中是一个包),API的提供程序实际上没有向后兼容性,因为它们提供了API。毕竟,API中的任何新义务都需要一些新代码

现在假设您让使用者有义务在API中实现这个新接口。此更改(编译器看不到)显然会破坏所有现有的使用者,因此对每个人来说都是破坏性的更改(例如1.2.3->2.0.0)

总结如下:

  • 微更改->与API的现有提供者和使用者向后兼容
  • 微小更改->API的现有提供程序不兼容,但使用者不兼容
  • 主要更改->现有的提供者和使用者不再兼容

问题在于OSGi语义版本控制,这使得API的提供者和使用者(在OSGi中通常是一个包)之间的(imho)区别非常重要,因为提供者遵循API提供者以外的其他向后兼容性规则。有关详细信息,请参见我的答案。我的答案比我的答案更关注提供商和消费者:+1