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 由以下组件组成
文件
-
config.toml
Cargo 的全局配置文件,请参阅参考中的 config 条目。 -
credentials.toml
来自cargo login
的私有登录凭据,用于登录到注册表。 -
.crates.toml
,.crates2.json
这些隐藏文件包含通过cargo install
安装的 crate 的package信息。请勿手动编辑!
目录
-
bin
bin 目录包含通过cargo install
或rustup
安装的 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.crate
和 registry/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 工具,可以仅清除缓存的选定部分或在命令行中显示其组件的大小。