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
命令生成的私有登录凭据,用于登录到 registry。 -
.crates.toml
,.crates2.json
这些隐藏文件包含通过cargo install
安装的 package 信息。请勿手动编辑!
目录
-
bin
bin 目录包含通过cargo install
或rustup
安装的 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.crate
和 registry/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 工具,用于仅清除缓存的选定部分或在命令行中显示其组件的大小。