【问题标题】:What exactly is considered a breaking change to a library crate?究竟什么被认为是对图书馆箱子的重大改变?
【发布时间】:2017-05-02 06:53:45
【问题描述】:

Rust crate 使用Semantic Versioning。因此,每个具有重大更改的版本都应该导致主要版本的升级。 重大更改通常被认为可能会破坏下游 crate(代码取决于相关库)。

然而,在 Rust 中,很多东西都有破坏下游板条箱的潜力。例如,更改(仅包括添加)公共符号集可能是一项重大更改,因为下游 crate 可以使用 glob-imports (use foo::*;) 将我们库的符号拉入它们的命名空间.因此,添加符号也可以破坏依赖的 crate;见this example

同样,更改(添加或更改版本)我们的 依赖项集可能会破坏下游构建。您还可以想象,下游 crate 依赖于我们的一种公共类型的特定大小。如果有的话,这很少有用;我只想表明:只要下游板条箱足够努力,一切都可能是一个突破性的变化。

这方面有什么指导方针吗? 究竟什么是重大更改,什么不是(因为它被认为是“用户的错”)?

【问题讨论】:

  • “更改我们的依赖项集”是指添加/删除依赖项,更改依赖项的版本,还是其中任何一种? (我个人认为对于前奏模块使用全局导入是不好的except,因此只有前奏模块应该担心添加符号)。
  • 仅当您的公共 API 不兼容复古时。
  • 如果代码无法编译(如您的示例中),我认为您不会考虑修改版本; semver 在这里似乎不适用。
  • @MatthieuM。 “任何这些” -> 是的。
  • @LukasKalbertodt:我很惊讶更改依赖项的版本可能会破坏下游板条箱。我认为 Rust 的名称修改和静态编译的目的是能够在最终的二进制文件中拥有同一个下游 crate 的多个实例。我错过了什么吗?

标签: rust rust-cargo semantic-versioning


【解决方案1】:

有一个关于这个主题的 Rust RFC:RFC 1105: API Evolution。它适用于任何 Rust 库项目,它涵盖了所有类型的更改(不仅仅是重大更改)以及它们如何影响语义版本控制。我将尝试总结 RFC 中的关键点,以免使此答案成为仅链接的答案。 :)

RFC 承认,几乎任何对库的更改都可能导致客户端突然停止编译。因此,它定义了一组 major changes,需要增加主要版本号,以及一组 minor changes,需要增加次要版本号数字;并非所有重大更改都是重大更改

微小更改的关键属性是,必须有一种方法可以让客户端通过稍微更改其源代码来提前避免损坏(例如,将 glob 导入更改为非 glob 导入,使用 UFCS 消除模棱两可的调用等)以使代码与更改之前的版本以及包含更改的版本兼容(假设它是次要版本)。一个小的改动也不能强迫下游的 crate 做出重大的破坏性改动来解决这个问题。


RFC(截至commit 721f2d74)中定义的主要变化是:

  • 将您的项目从与稳定编译器兼容切换到仅与夜间编译器兼容。
  • 重命名、移动或删除模块中的任何公共item
  • 当所有当前字段都是公共的时,将私有字段添加到结构中。
  • 将公共字段添加到没有私有字段的结构中。
  • 向枚举添加新变体。
  • 向枚举变体添加新字段。
  • 向特征添加非默认项。
  • 对特征项签名的任何重大更改。
  • 在现有类型上实现 fundamental 特征。
  • 收紧现有类型参数的界限。
  • 向函数添加或删除参数。
  • 未在 RFC 中列为次要更改的任何其他重大更改。

RFC 中定义的微小更改(截至commit 721f2d74,除非另有说明,否则会中断)是:

  • 在 crate 上更改 Cargo 功能的使用。
  • 在模块中添加新的公共项目。
  • 在结构中至少存在一个私有字段时添加或删除私有字段(更改前后)[不中断]
  • 将包含所有私有字段(至少包含一个字段)的元组结构转换为普通结构,反之亦然。
  • 为特征添加默认项。
  • 为特征添加默认类型参数[不中断]
  • 在现有类型上实现任何非基本特征。
  • 将任何项目添加到固有的impl
  • 更改函数的未记录行为。
  • 放松现有类型参数的界限[不中断]
  • 向类型或特征添加默认类型参数[不中断]
  • 通过将其类型替换为默认为前一个类型的新类型参数来概括现有结构或枚举字段[在修复issue 27336 之前中断]
  • 为现有函数引入新类型参数。
  • 通过将类型替换为可实例化为先前类型的新类型参数来概括现有函数的参数或返回类型。
  • 引入新的 l​​int 警告/错误。

有关说明和示例,请参阅the RFC

【讨论】:

    猜你喜欢
    • 2017-07-26
    • 2010-12-31
    • 2016-03-15
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多