当一个Rust库同时也是可执行文件时,是否应该提交Cargo.lock文件?

28
2个回答

22
是的,依赖于您的库的crate将忽略您的Cargo.lock。Cargo FAQ提供了更多细节
为什么二进制文件有Cargo.lock在版本控制中,但库没有? Cargo.lock的目的是描述成功构建时世界的状态。然后,它用于通过确保编译完全相同的依赖关系来提供确定性构建,无论哪台机器正在构建软件包。
这个属性对于位于依赖链末端(二进制文件)的应用程序和软件包最具吸引力。因此,建议所有二进制文件检查其Cargo.lock
对于库来说,情况有些不同。库不仅由库开发人员使用,还由任何下游消费者使用。依赖于库的用户不会检查库的Cargo.lock(即使存在)。这正是因为库不应该被确定地重新编译为库的所有用户。
如果一个库最终被几个依赖项传递使用,则可能只需要一个库的副本(基于semver兼容性)。如果Cargo使用所有依赖项的Cargo.lock文件,则可以使用多个库的副本,甚至可能出现版本冲突。
换句话说,库为其依赖项指定semver要求,但无法看到全貌。只有像二进制文件这样的最终产品才能看到完整的情况,以决定应使用哪些依赖项的版本。

8

我从优秀的项目ripgrep中发现了最佳实践,该项目将自身拆分为几个 crate 库。对于根目录下的二进制 crate 库,他们会跟踪 Cargo.lock 文件,但是对于提供应用程序功能的库 crate 库(例如pcre2),他们不会跟踪。


6
这是具有误导性的,因为 ripgrep 中的 pcre2 包实际上是在根目录下定义的工作区的一部分,并且工作区始终共享位于根目录中的单个 Cargo.lock 文件。 - sammko
@Danielhu 请编辑答案。ripgrep 使用工作区,因此二进制文件和库使用相同的 Cargo.lock。 - Ordoshsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接