Cargo 主目录

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

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

Cargo 主目录包含以下组件

文件

  • config.toml Cargo 的全局配置文件,请参阅参考文档中的config 条目

  • credentials.toml 来自cargo login的私有登录凭据,用于登录注册表

  • .crates.toml.crates2.json 这些隐藏文件包含通过cargo install安装的 crate 的信息。请勿手动编辑!

目录

  • 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 是使用 .crate 扩展名命名的压缩 gzip 存档。

    • registry/src 如果包需要下载的 .crate 存档,则将其解压缩到 registry/src 文件夹中,rustc 将在其中找到 .rs 文件。

在 CI 中缓存 Cargo 主目录

为了避免在持续集成期间重新下载所有 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/

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

请参阅cargo vendor子命令。

清除缓存

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

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