为什么Cargo会为同一个注册表创建多个目录?

5

Cargo将下载的crate源代码存储在$HOME/.cargo/registry/src(或适当的$CARGO_HOME目录)中。我知道每个我使用的唯一的registry都会创建一个单独的目录,这是为了避免冲突。

我不明白的是为什么同一个存储库会创建多个目录:

$ ls -ld ~/.cargo/registry/src/github.com-*
drwxr-xr-x   473 shep  staff  16082 Dec 27  2015 ~/.cargo/registry/src/github.com-0a35038f75765ae4
drwxr-xr-x  1187 shep  staff  40358 Feb  8 19:10 ~/.cargo/registry/src/github.com-1ecc6299db9ec823
drwxr-xr-x   380 shep  staff  12920 Sep 11 12:16 ~/.cargo/registry/src/github.com-88ac128001ac3a9a

预计附加到末尾的哈希在其中起某种作用。是什么导致Cargo创建这些目录?它会回到之前的目录并继续使用吗?


我认为每个 Rust 版本都会创建一个目录。 - kennytm
如果是这样的话,我会期望有超过15个版本(包括当前稳定版1.15、测试版、夜间版和1.0之前的版本),而不仅仅是3个。 - Shepmaster
1
有趣的是,cargo-update 的用户也报告说最新版本有时不是 cargo 使用的版本。报告链接 - набиячлэвэли
1个回答

6

哈希值基于两个字段:源的类型(中央仓库、git引用、本地路径等)和源的URL。

Cargo曾经委托rust-url对Url的Hash实现进行处理,但随着时间的推移,该实现发生了变化。在拉取请求2737中,Cargo的实现最后一次更改以修复问题1710;现在,Cargo将URL字符串进行哈希处理,而不是使用Url对象,以生成更稳定的哈希值,并且不依赖rust-url的行为。

此外,Cargo使用现已过时的SipHasher哈希函数。由于它已过时,未来Cargo可能会改用另一种哈希函数(或SipHasher可能会移至一种crate,Cargo将使用该crate,谁知道呢)。

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