Cargo home
"Cargo home" 的功能是为下载和源代码提供缓存。
当构建crate时,Cargo会将下载的构建依赖保存在 Cargo home 中。你可以通过设置 CARGO_HOME
environmental variable "环境变量" 来修改Cargo home的位置。
如果你需要在自己的crate中获取这个位置,home crate 提供了相关的API。
注意,Cargo home的内部结构规范还未稳定下来,可能会改变。
Cargo home由以下几个部分构成:
文件:
-
config.toml
Cargo 的全局配置文件,参阅 参考部分的config 内容。 -
credentials.toml
cargo login
的私有凭证,用于登陆某个 registry "注册中心" 。 -
.crates.toml
,.crates2.json
这些隐藏文件包含通过cargo install
下载的 package 的信息。不要手动修改这些文件!
目录:
-
bin
bin目录中保存通过cargo install
或rustup
下载的可执行文件。 方便在终端中直接使用这些二进制文件,可以把该目录添加到$PATH
环境变量。 -
git
Git源代码保存在这里:-
git/db
当crate的依赖是git仓库,Cargo会将这个仓库clone到该目录下作为一个裸仓库 (只有.git
文件夹中的内容) ,并在必要时更新该仓库。 -
git/checkouts
如果某个git源的代码被用到,实际的代码会从git/db
内的仓库中checkout检出,保存在该目录下。 为编译器提供依赖指定的 commit 文件。从而可以检出同一个仓库的不同提交。
-
-
registry
crate注册中心(比如crates.io)的元数据和下载的包保存在这个文件夹中。-
registry/index
index是一个裸仓库,其中包含着注册中心所有可用crate的元数据(版本、依赖等)。 -
registry/cache
下载的依赖项源代码保存在cache目录中。这些crate被压缩为gzip文件,以.crate
为后缀。 -
registry/src
如果某个包需要已下载的.crate
压缩文件,该文件会解压到registry/src
目录,从而让rustc能找到相应的.rs
文件。
-
在CI中缓存Cargo home
为避免在持续集成时重复下载所有crate依赖,你可以对 $CARGO_HOME
目录进行缓存。
但是,缓存整个Cargo home目录往往低效,因为它会把相同的代码保存两遍。
如果我们依赖一个crate叫做 serde 1.0.92
而缓存了整个 $CARGO_HOME
,会把源代码存两遍( registry/cache
中的 serde-1.0.92.crate
以及解压到 registry/src
的 .rs
文件)。
这会拖慢构建过程,下载、解压、压缩和重新上传cache到CI服务器都会消耗时间。
只需缓存以下的文件夹就足够了:
bin/
registry/index/
registry/cache/
git/db/
打包缓存项目的所有依赖
见 cargo vendor
子命令。
译者注:"vendor"这个词本身是个名词,意为"小贩、销售商",在软件领域往往表示"将源代码和其所依赖的第三方库统一管理"的意思。像npm的 node_modules
。
参考来源wiktionary-vendor
清除缓存
理论上,你可以删除cache的任何部分,当一个crate需要某些源码时,Cargo会帮你恢复,要么是解压已有的压缩文件或从裸仓库中检出,或从网上重新下载源文件。
另一种方法是,cargo-cache crate 提供了一个CLI工具来只清除cache中选中的部分和显示cache组成部分所占用的空间大小。