第12章 Cargo 主目录
“Cargo home”充当下载与源码的缓存目录。在构建 crate 时,Cargo 会将已下载的构建依赖项存入此目录。你可以通过设置 CARGO_HOME 这个 环境变量 来更改其位置。若需在 Rust crate 内部获取该路径,可引用 home 库提供的 API。默认情况下,Cargo home 位于 $HOME/.cargo/。
请注意,Cargo home 的内部结构尚未保持稳定,随时可能发生变更。
Cargo home 由以下组件组成:
文件:
-
config.tomlCargo 的全局配置文件,详见 参考手册中的 config 条目。 -
credentials.toml由cargo login生成的私有登录凭证,用于登录 registry。 -
.crates.toml、.crates2.json这些隐藏文件存储了通过cargo install安装的 package 信息。切勿手动编辑!
目录:
-
bin该目录存放通过cargo install或rustup安装的 crate 可执行文件。需将该目录路径添加至$PATH环境变量,才能访问这些二进制文件。 -
gitGit 源代码存储于此:-
git/db若 crate 依赖于 Git 仓库,Cargo 会将其以裸仓库(bare repo)形式克隆至此目录,并根据需要更新。 -
git/checkouts当使用 Git 源时,系统会从git/db中的裸仓库检出指定 commit,并将其文件提取至此目录。这确保了编译器能获取该依赖项指定 commit 中的实际文件。支持对同一仓库的不同 commit 进行多次检出。
-
-
registry存放 crate 注册表(如 crates.io)的包和元数据。-
registry/index索引是一个裸 Git 仓库,包含注册表中所有可用 crate 的元数据(版本、依赖项等)。 -
registry/cache下载的依赖项存储在此缓存中。crate 是压缩后的 gzip 归档文件,扩展名为.crate。 -
registry/src如果某个包需要已下载的.crate归档文件,它会被解压到registry/src目录,以便 rustc 找到其中的.rs文件。
-
在 CI 中缓存 Cargo 主目录
为了避免在持续集成过程中重新下载所有 crate 依赖项,你可以缓存 $CARGO_HOME 目录。
然而,缓存整个目录通常效率较低,因为其中会包含两份下载的源码。
例如,如果我们依赖 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.jsonbin/registry/index/registry/cache/git/db/
打包项目的所有依赖项
请参阅 cargo vendor 子命令。
清除缓存
理论上,你可以随时删除缓存中的任何内容。当某个 crate 需要这些资源时,Cargo 会尽力恢复源码:要么重新解压归档、检出裸仓库,要么直接从网上重新下载。
另外,cargo-cache 这个 crate 提供了一个简单的命令行工具,可以选择性地清理缓存的某一部分,或者在终端中查看各部分占用的空间。