如何避免Cargo工作区中因二进制文件特性不同导致库重复构建?
解决Cargo工作区单个包构建时重复编译库的问题
你可以通过以下几种方式让Cargo在单个包构建时复用工作区统一的库构建产物,避免重复编译:
在工作区根目录指定目标包执行命令
不要进入单个包目录执行cargo run/cargo test/clippy,而是在工作区根目录用-p参数指定目标包。比如:# 运行指定二进制包 cargo run -p my-binary # 测试指定库包 cargo test -p my-library # 检查指定二进制包 cargo clippy -p my-binary这种方式下,Cargo会基于整个工作区的依赖关系解析特性,构建兼容所有包需求的库版本,后续所有指定包的命令都会复用这个已构建的库,不会重新编译。
在工作区层面统一库的特性依赖
如果可以接受所有二进制包使用同一套库特性,直接在工作根目录的Cargo.toml里统一配置库的依赖特性:[workspace.dependencies] my-library = { path = "./my-library", features = ["feature-x", "feature-y"] }然后各个二进制包的
Cargo.toml直接引用工作区依赖:[dependencies] my-library = { workspace = true }这样不管构建哪个二进制包,都会使用工作区统一指定的特性集,库只需要编译一次即可被所有包复用。
预编译整个工作区
先在工作区根目录执行全工作区构建,提前生成所有需要的库构建产物:cargo build --workspace完成后再进入单个包目录执行命令,Cargo会检测到已存在符合要求的缓存产物,直接复用,不会重新编译库。
注意:如果你的库存在互斥特性(启用A就无法启用B),Cargo仍然会编译多个不同特性组合的库版本,这种情况无法避免重复编译,只能尽量统一特性或者接受多版本构建。
内容的提问来源于stack exchange,提问作者Dario
相关产品推荐
相关产品推荐

