【问题标题】:Is it good practice to use the latest versions of dependencies when publishing?发布时使用最新版本的依赖项是一种好习惯吗?
【发布时间】:2020-08-25 07:05:00
【问题描述】:

我正在构建一个使用一些依赖项的 crate,为了发布它,我必须指定依赖项的版本。我将dep = "*" 替换为dep = ">=N"N 替换了我的dep = "*",这是我在cargo update 之后可以获得的最新版本。

我应该放宽/降低所需的版本吗?

我怎么能这样做?我尝试将dep = "M" 设置为M 的版本号要低得多,但cargo 继续使用较新的版本号。是否有工具可以找到构建和测试我的 crate 所需的最低 M

【问题讨论】:

  • 一般来说,你应该使用插入符要求(如 `bitflags = "^1.2.1"),因为它确保货物只使用兼容版本的依赖项(在这种情况下,版本 1.2.5 和 1.5 .2 是允许的,但不是 1.1.7、1.2.0 或 2.1.3)请参阅the cargo book 了解更多信息。

标签: rust dependency-management rust-cargo


【解决方案1】:

The version field 下,货运手册指出:

Cargo 以Semantic Versioning 的概念烘焙,因此请确保遵循一些基本规则:

  • 在您达到 1.0.0 之前,一切正常,但如果您进行重大更改,请增加次要版本。在 Rust 中,重大更改包括向结构添加字段或向枚举添加变体。
  • 在 1.0.0 之后,仅在增加主要版本时进行重大更改。不要破坏构建。
  • 在 1.0.0 之后,不要在补丁级版本中添加任何新的公共 API(没有新的 pub 任何东西)。如果您添加任何新的 pub 结构、特征、字段、类型、函数、方法或其他任何内容,请始终增加次要版本。
  • 使用包含三个数字部分的版本号,例如 1.0.0 而不是 1.0。

如果您的依赖项的维护者已经采用并正确应用了这些规则,那么,给定该依赖项的特定版本(您知道您的 crate 可以使用该版本),相同主要版本的任何后续补丁版本应该 始终有效——只要主要版本不为 0,同一主要版本的后续次要版本应该也始终有效。

作为Herman L alludes,您可以使用插入符号前缀指定您想要最新的此类“兼容”版本。他将您引导至货物书籍的 Specifying Dependencies 章节,其中解释说:

插入符要求

插入符要求允许将 SemVer 兼容更新到指定版本。如果新版本号没有修改主要、次要、补丁分组中最左边的非零数字,则允许更新。在这种情况下,如果我们运行cargo update -p time,如果它是最新的0.1.z 版本,cargo 应该更新我们到版本0.1.13,但不会更新我们到0.2.0。相反,如果我们将版本字符串指定为^1.0,那么如果它是最新的1.y 版本,cargo 应该更新为1.1,而不是2.00.0.x 版本不被认为与任何其他版本兼容。

以下是插入符号要求的更多示例以及它们允许的版本:

^1.2.3 := >=1.2.3, =1.2.0, =1.0.0, =0.2.3, =0.2.0, =0.0.3, =0.0.0, =0.0.0,

此兼容性约定与 SemVer 处理 1.0.0 之前版本的方式不同。虽然 SemVer 表示 1.0.0 之前不兼容,但 Cargo 认为 0.x.y0.x.z 兼容,其中 y ≥ zx > 0

当然,一些包维护者可能会忽略 SemVer 而采用其他版本控制方案;可能会尝试使用 SemVer 但应用不正确;或者可能在没有意识到的情况下无意中进行了重大更改。幸运的是,最受欢迎的 crate 非常活跃且维护良好,并且(根据我的经验)此类问题相对较少。 Rust 的强类型系统还通过阻止许多此类破坏性更改甚至编译来提供一些额外的保护,因此它们通常很早就被发现。

当然,所有重大更改都应该由您的集成测试来处理(您的构建管道始终确保在发布之前通过,对吧?)。 Dependabot 之类的工具还可以提醒您发布后更新的依赖项(例如,通过创建 PR),这反过来可以触发您的 CI 管道立即针对新的依赖项版本运行您的测试套件并报告结果。

可能有充分的理由采用不同的方法,但在大多数情况下,上述方法大体上是合理的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 2022-06-23
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 2013-03-30
    相关资源
    最近更新 更多