如何让cargo build仅重编译目标包 复用已编译依赖
核心逻辑
Cargo默认不会自动追踪未在构建规则中显式声明的输入文件,要么会因为检测逻辑模糊触发全量依赖重编,要么无法感知自有代码需要更新,只要明确声明构建过程依赖的文件路径,就能让Cargo精准控制重编范围,完全复用已有的依赖编译缓存。
落地方案
自动追踪方案(长期最优,无手动操作)
在自行编写的业务包(nextclade)与Cargo.toml同级的目录下,新增或修改build.rs构建脚本,添加如下配置:// build.rs fn main() { // 告知Cargo:.env是当前包的构建输入,该文件变更时仅重编当前包 println!("cargo:rerun-if-changed=.env"); // 原有构建脚本的逻辑(比如读取.env注入编译期环境变量的代码)直接保留即可 }配置生效后,Cargo会自动监听
.env文件变更,文件修改后只会重编对应自有业务包,全部依赖的编译缓存不会失效,构建速度和日常增量编译一致。场景适配提示
如果使用的是dotenv的运行时加载逻辑(即代码中通过dotenv::dotenv().ok()在程序启动阶段读取配置),.env内容完全不参与编译流程,修改后根本不需要执行cargo build,直接运行已编译好的二进制文件就会加载新的配置值,无任何编译开销。临时手动方案(无需修改构建脚本)
修改.env后,直接执行touch 包入口文件路径(二进制项目执行touch src/main.rs,库项目执行touch src/lib.rs),再运行cargo build即可。此时Cargo只会判定自有包需要重编,所有依赖直接复用已有缓存,不会触发重复编译。
之前操作失效原因
之前执行cargo clean -p nextclade仍触发全依赖重编,是因为构建脚本未显式声明rerun-if-changed规则时,Cargo默认的重编检测逻辑会全量扫描构建链路状态,很容易连带触发依赖的重编流程,不推荐用clean命令触发单包重编。
内容的提问来源于stack exchange,提问作者Cornelius Roemer

