一般来说,我使用以下方式编译工作区中的所有内容: 工作区目录中的
cargo build
,或使用 cargo build --workspace
但是,如果我随后使用
cargo build -p package
编译特定包或从该包的目录运行 cargo build
,它会重新编译它,而实际上它应该完全缓存,对吗?
看来重新运行的东西大多与宏有关...重新编译
syn
,serde_derive
等...
是否认为这些宏包需要重新编译,因为它们可能会给出不同的结果?我觉得如果我们想要可重现的构建,情况真的不应该如此!
我该怎么做才能防止货物像这样重新编译?
(这是运行 Raspbian 10 的树莓派 4 上的货物 1.51.0)
当不同的软件包具有不同的功能集时,可能会发生这种情况。当
cargo build --workspace
运行时,依赖项是通过启用的功能的联合构建的。当使用 -p package-name
时,仅使用该包所需的功能,导致重新编译依赖项,其中某些功能未打开。
如果我运行
cargo build --bin package-name
,重新编译的板条箱数量会少得多,尽管仍然有一些。
在 Rust 论坛上有一个关于此问题的简短讨论。