结论:build.rs 是编译主 crate 之前先编译并运行的构建脚本,用于代码生成(protobuf、绑定)、探测/编译 C 依赖、生成版本信息等构建期任务,通过 cargo: 指令和标准输出与 cargo 通信。

展开:常见用途:1)代码生成——prost/tonic 从 .proto 生成 Rust 代码,bindgen 从 C 头文件生成 FFI 绑定,产物写到 OUT_DIR 再由源码 include! 引入;2)编译链接 C 库——cc crate 编译 .c 文件,println!("cargo:rustc-link-lib=...") 声明链接;3)注入构建期信息——git commit、构建时间通过 cargo:rustc-env=KEY=VALUEenv! 读取。注意事项:1)变更检测——默认任何文件变化都重跑脚本,应用 cargo:rerun-if-changed=xxx 精确声明,否则拖慢增量编译;2)build.rs 跑在主机环境,交叉编译时注意 TARGET/HOST 的区别;3)不要把网络下载、依赖系统状态的逻辑写进脚本,破坏可复现构建。

fn main() {
    println!("cargo:rerun-if-changed=proto/");
    prost_build::compile_protos(&["proto/svc.proto"], &["proto/"]).unwrap();
}

追问方向:OUT_DIR 产物的 include 方式、workspace 下构建脚本的缓存行为。