锁定文件提交指南变更

2023 年 8 月 29 日 · Ed Page 代表 Cargo 团队

多年来,Cargo 团队一直鼓励 Rust 开发人员 将包含二进制文件的包的 Cargo.lock 文件提交到版本控制,但库除外。我们现在建议人们 选择最适合其项目的做法。为了帮助人们做出决定,我们确实提供了一些考虑因素,并建议将 Cargo.lock 作为决策过程的起点。为了与该起点保持一致,从 nightly-2023-08-24 开始,cargo new 将不再忽略库的 Cargo.lock。无论项目做出何种决定,我们都鼓励定期 针对最新依赖项进行测试

背景

旧的指南确保库测试其最新的依赖项,这有助于我们通过确保快速发现和解决问题(尤其是向后兼容性问题)来保持 Rust 包生态系统的质量。虽然这种额外的测试并不详尽,但我们相信它有助于在这一新兴生态系统中培养一种质量文化。

但这并非没有缺点。这从代码库中删除了重要的历史记录,使维护人员更难进行二分查找以找到错误的根本原因。对于贡献者,尤其是新手来说,当依赖项被撤回或新版本包含错误时,这是另一个可能导致 CI 不可靠并引发困惑和沮丧的潜在来源。

为什么改变

自编写指南以来,Rust 发生了很大变化。Rust 已从面向早期采用者的语言转变为更主流的语言,我们需要关注这些 Rust 新手的入门体验。此外,随着这种更广泛的采用,并不总是可以实际地假设每个人都在使用最新的 Rust 版本,并且社区一直在努力解决如何管理对最低支持 Rust 版本 (MSRV) 的支持。其中一部分是维护一个可以与您的 MSRV 构建的依赖项树实例。锁定文件是为您的项目固定版本的合适方法,这样您就可以验证您的 MSRV,但我们发现人们反而在版本要求中设置了上限,因为我们之前的指南非常严格,尽管 这可能是一个更糟糕的解决方案

在此期间,更广泛的软件开发生态系统也发生了很大变化。CI 的设置和维护变得更加容易。我们还有像 DependabotRenovate 这样的产品。这为测试更新的依赖项提供了除版本控制忽略 Cargo.lock 之外的选择。开发人员可以安排一个定期运行 cargo update 的作业。他们还可以让机器人定期在 PR 中更新他们的 Cargo.lock,确保它们在合并之前通过 CI。

由于这些情况没有普遍的答案,我们认为最好将选择权留给开发人员,并为他们提供做出决定的必要信息。有关此策略变更的反馈,请参阅 rust-lang/cargo#8728。您也可以在 Zulip 上更广泛地联系 Cargo 团队。