入门 The Cargo Team 2026-09-13 15:48:21 · 0 阅读

第22章 Cargo 构建缓存

Cargo 将构建输出保存到 “target” 和 “build” 目录中。默认情况下,这两个目录都指向 workspace 根目录下的 target 目录。要修改 target-dir 的位置,可以设置 CARGO_TARGET_DIR 环境变量build.target-dir 配置值,或使用 --target-dir 命令行标志。要修改 build-dir 的位置,可以设置 CARGO_BUILD_BUILD_DIR 环境变量build.build-dir 配置值。 制品分为两大类:
  • 最终构建制品
    • 最终构建制品是面向 Cargo 最终用户的输出
    • 例如 bin crate 的二进制文件、cargo doc 的输出、Cargo --timings 报告
    • 存储在 target-dir 中
  • 中间构建制品
    • 中间构建制品是 Cargo 和 Rust 编译器内部使用的
    • 最终用户通常不需要与中间构建制品交互
    • 存储在 Cargo build-dir 中
目录结构取决于是否使用 --target 标志为特定平台构建。如果未指定 --target,Cargo 将以针对宿主架构构建的模式运行。输出会存放在目标目录的根目录下,每个 profile 存放在独立的子目录中:
目录说明
target/debug/包含 dev profile 的输出。
target/release/包含 release profile 的输出(使用 --release 选项)。
target/foo/包含 foo profile 的构建输出(使用 --profile=foo 选项)。

由于历史原因,devtest profile 的输出存放在 debug 目录中,releasebench profile 的输出存放在 release 目录中。用户自定义的 profile 则存放在与 profile 同名的目录里。

使用 --target 为其他目标平台构建时,输出会放到以该 target 命名的目录下:

目录示例
target/<triple>/debug/target/thumbv7em-none-eabihf/debug/
target/<triple>/release/target/thumbv7em-none-eabihf/release/

注意:不使用 --target 时,Cargo 会让构建脚本和 proc macro 与你的依赖共享编译结果,且每次调用 rustc 都使用同一份 RUSTFLAGS。而使用 --target 时,构建脚本和 proc macro 会单独构建(针对宿主架构),不共享 RUSTFLAGS

在 profile 目录(如 debugrelease)内,构建产物按如下目录存放:

目录说明
target/debug/存放所构建包的输出,即二进制可执行文件library target
target/debug/examples/存放example target

有些命令会把输出放到 target 目录顶层下的专用目录中:

目录说明
target/doc/存放 rustdoc 文档(cargo doc)。
target/package/存放 cargo package 的输出。

Cargo 还会在 build-dir 中创建构建过程所需的若干其他目录和文件。build-dir 的目录结构被视为 Cargo 的内部实现,可能会变更。其中一些目录包括:

目录说明
<build-dir>/debug/deps/依赖项及其他制品。
<build-dir>/debug/incremental/rustc增量输出,用于加速后续构建的缓存。
<build-dir>/debug/build/构建脚本的输出。

Dep-info 文件

每个编译制品旁边都有一个以 .d 为后缀的文件,称为“dep info”文件。该文件采用类似 Makefile 的语法,列出了重建制品所需的所有文件依赖关系。它供外部构建系统使用,以便检测是否需要重新执行 Cargo。文件中的路径默认为绝对路径。参见 build.dep-info-basedir 配置选项以使用相对路径。

# target/debug/foo.d 中示例 dep-info 文件
/path/to/myproj/target/debug/foo: /path/to/myproj/src/lib.rs /path/to/myproj/src/main.rs

共享缓存

可以使用第三方工具 sccache 在不同 workspace 之间共享已构建的依赖项。

配置 sccache 的方法是通过 cargo install sccache 安装,并在调用 Cargo 前将环境变量 RUSTC_WRAPPER 设置为 sccache。如果使用 bash,建议在 .bashrc 中添加 export RUSTC_WRAPPER=sccache。或者,也可以在 Cargo 配置 中设置 build.rustc-wrapper。更多细节请参考 sccache 文档。

评论 (0)