Rust crates使用Semantic Versioning。因此,每个具有突破性更改的版本都会导致主要版本的崩溃。 重大变更通常被认为可能破坏下游的包装箱(代码取决于相关的库)。
然而,在Rust中,很多都有可能打破下游板条箱。例如,更改(仅包括添加到)公共符号集可能是一个重大变化,因为下游包可以使用glob-imports(use foo::*;
)将我们库的符号拉入命名空间。因此,添加符号也可以破坏相关的条件箱;见this example。
同样,更改(添加或更改版本)我们的依赖项集可能会破坏下游构建。您还可以想象下游包依赖于我们的一种公共类型的特定大小。如果有的话,这很少有用;我只是想表明:如果只有下游的箱子足够努力,一切都可能是一个突破性的变化。
这有什么指导方针吗? 究竟什么是真正的改变,什么不是(因为它被认为"用户的错误")?
答案 0 :(得分:6)
有关此主题的Rust RFC:RFC 1105: API Evolution。它适用于任何Rust库项目,它涵盖了所有类型的更改(不仅仅是重大更改)以及它们如何影响语义版本控制。我将尝试总结RFC中的关键点,以便不将此答案作为仅链接答案。 :)
RFC承认,对库的任何更改都会导致客户端突然停止编译。因此,它定义了一组主要更改,它需要主要版本号的冲击,以及一组次要更改,这需要次要版本的冲击数;并非所有重大变更都是主要变更。
微小变化的关键属性是必须有一种方法,客户可以通过稍微改变其源代码来预先避免破坏(例如,将glob导入更改为非glob导入,消除使用UFCS的模糊调用的歧义以这种方式使代码与更改之前的版本兼容,并与包含更改的版本兼容(假设它是次要版本)。一个微小的变化也不得强迫下游板条箱进行重大的破碎变化以解决破损问题。
RFC中定义的主要更改(截至commit 721f2d74
)是:
RFC中定义的次要更改(从commit 721f2d74
开始,除非另有说明,否则为:
impl
。有关解释和示例,请参阅the RFC。