Cargo Home

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

请注意,Cargo home 的内部结构不稳定,可能随时更改。

Cargo home 由以下组件组成

文件

目录

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

  • git Git 源代码存储在此处

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

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

  • registry crate 注册表(例如 crates.io)的软件包和元数据位于此处。

    • registry/index 索引是一个裸 git 存储库,其中包含注册表中所有可用 crate 的元数据(版本、依赖项等)。

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

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

在 CI 中缓存 Cargo home

为了避免在持续集成期间重新下载所有 crate 依赖项,您可以缓存 $CARGO_HOME 目录。但是,缓存整个目录通常效率低下,因为它会包含两次下载的源代码。如果我们依赖于一个 crate(例如 serde 1.0.92)并缓存整个 $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/

供应商化项目的所有依赖项

请参阅 cargo vendor 子命令。

清除缓存

理论上,您可以随时删除缓存的任何部分,如果 crate 需要它们,Cargo 将尽力恢复源代码,方法是重新提取存档,检出裸存储库或只是从网络重新下载源代码。

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