Cargo 主目录

“Cargo 主目录”用作下载和源代码的缓存。构建一个 crate 时,Cargo 会将下载的构建依赖项存储在 Cargo 主目录中。您可以通过设置 CARGO_HOME 环境变量 来更改 Cargo 主目录的位置。如果您需要在 Rust crate 中获取此位置信息,home crate 提供了获取此位置的 API。默认情况下,Cargo 主目录位于 $HOME/.cargo/

请注意,Cargo 主目录的内部结构尚未稳定,随时可能发生变化。

Cargo 主目录包含以下组件:

文件

目录

  • bin bin 目录包含通过 cargo installrustup 安装的 crate 的可执行文件。为了使这些二进制文件可访问,请将该目录的路径添加到您的 $PATH 环境变量中。

  • git Git 源代码存储在此处

    • git/db 当 crate 依赖于 Git 仓库时,Cargo 会将该仓库克隆为一个裸仓库到此目录中,并在必要时进行更新。

    • git/checkouts 如果使用了 Git 源代码,所需的仓库提交会从 git/db 中的裸仓库检出到此目录中。这为编译器提供了指定依赖项提交的仓库中包含的实际文件。同一个仓库的不同提交可以进行多次检出。

  • registry crate registry(例如 crates.io)的 package 和元数据位于此处。

    • registry/index index 是一个裸 Git 仓库,其中包含 registry 中所有可用 crate 的元数据(版本、依赖项等)。

    • registry/cache 下载的依赖项存储在缓存中。这些 crate 是压缩的 gzip 存档,文件扩展名为 .crate

    • registry/src 如果 package 需要已下载的 .crate 存档,它将被解压到 registry/src 文件夹中,rustc 将在此处找到 .rs 文件。

在 CI 中缓存 Cargo 主目录

为了避免在持续集成(CI)期间重新下载所有 crate 依赖项,您可以缓存 $CARGO_HOME 目录。然而,缓存整个目录通常效率不高,因为它会包含两次下载的源代码。如果我们依赖于像 serde 1.0.92 这样的 crate 并缓存整个 $CARGO_HOME,实际上会缓存两次源代码:registry/cache 中的 serde-1.0.92.crateregistry/src 中解压的 serde .rs 文件。这会不必要地减慢构建速度,因为下载、解压、重新压缩并将缓存重新上传到 CI 服务器可能需要一些时间。

如果您希望缓存通过 cargo install 安装的二进制文件,则需要缓存 bin/ 文件夹以及 .crates.toml.crates2.json 文件。

跨构建缓存以下文件和目录应该足够:

  • .crates.toml
  • .crates2.json
  • bin/
  • registry/index/
  • registry/cache/
  • git/db/

Vendor 项目的所有依赖项

请参阅 cargo vendor 子命令。

清除缓存

理论上,您可以随时删除缓存的任何部分,Cargo 将尽力恢复源文件,如果 crate 需要它们,它会通过重新解压存档、检出裸仓库或简单地从网络重新下载源文件来恢复。

此外,cargo-cache crate 提供了一个简单的 CLI 工具,用于仅清除缓存的选定部分或在命令行中显示其组件的大小。