【发布时间】:2015-08-13 11:05:36
【问题描述】:
此问题适用于以一种语言(“来源”)编写的任何语言,例如C 或 Java,并以另一个(“二进制”)分发,例如机器码或 Java 字节码,使用动态链接。
假设用户已经在使用我的库的 A 版。我发布了一个更新的版本 B。
如果他可以编译他的代码而无需针对 B 进行更改并正确地与 B 一起运行,则从 A 到 B 的更改被称为 源代码兼容。
如果他可以针对 A 编译他的代码并正确地与 B 一起运行,则从 A 到 B 的更改被称为 二进制兼容。这种情况在使用没有隔离模块加载的传递依赖图(例如 OSGI)时很常见。 X 是针对特定版本的 Y 和 Z 编译的,而 Y 是针对不同的特定版本 Z 编译的。在运行时,Y 对 Z 的调用可能不正确并且可能会崩溃。
更改可能是源兼容的,但二进制不兼容。更改也可能是源不兼容和二进制兼容。
我使用哪种兼容性来进行语义版本控制?我是使用源兼容性来区分主要和次要/补丁更新,还是使用二进制兼容性来区分主要和次要/补丁更新?
我目前的动机是 Scala 库。 Scala 二进制兼容性很难分析,需要对编译器细节有很好的理解。源代码兼容和二进制不兼容很常见。
这不是什么奇怪的边缘情况;此问题可能出现在大多数已编译的、动态链接的语言中。
【问题讨论】:
标签: version backwards-compatibility semantic-versioning