207 个稳定版本
1.8.16 | 2022年2月18日 |
---|---|
1.8.11 | 2021年12月15日 |
1.8.5 | 2021年11月17日 |
1.7.9 | 2021年7月31日 |
0.21.0 | 2019年11月26日 |
168 在 神奇豆 中排名
2,231 每月下载量
8KB
Cargo(截至1.37版本)无法很好地处理树中多个其他crate的依赖crate的特性能量不同的场景。
为了说明问题,考虑如下排列的crate A、B 和 C
- Crate A 和 B 都是 Cargo 虚拟清单的成员
- Crate C 提供两个功能,F1 和 F2
- Crate A 请求 C 的功能 F1,crate B 请求 C 的功能 F2
当 crate A 和 B 一起构建时,cargo
将 C 构建为同时启用功能 F1 和 F2(所有启用功能的并集)。然而,当 A 或 B 单独构建时,cargo
将 C 构建为仅启用功能 F1 或 F2。
不幸的是,在这些所有情况下,cargo
都会在相同的目标位置构建 crate C,并且每次 crate C 的功能更改时,C 的输出都会被重新创建。
从干净的工作区开始,首先单独构建 A 将导致 C 如预期构建。然后单独构建 B,C 将会重新构建,因为启用了 F2 而不是 F1。现在重新构建 A,并观察 C 将会再次重新构建,因为 F1 被重新启用。
在实际中,这个问题并不那么明显,因为A和B很可能没有直接依赖C,这间接导致了众多其他crate的重建。
solana-crate-features
通过显式声明所有“类似C的crate”及其在树中(无论是显式还是隐式)启用的所有功能,提供了一种解决“功能抖动”问题的方法。Solana源树中的所有crate都应该依赖solana-crate-features
。
添加新的依赖crate
当观察到不必要的cargo
重建时,第一步是确定哪个依赖crate正在遭受功能抖动。
此信息无法从标准cargo
程序中轻松获取,因此请使用以下步骤生成一个定制的cargo
程序,该程序将在构建过程中将必要的功能信息输出到stderr
$ git clone [email protected]:rust-lang/cargo.git -b rust-1.38.0
$ cd cargo
$ git apply 0001-Print-package-features.patch
$ cargo build
$ mv ~/.cargo/bin/cargo ~/.cargo/bin/cargo.org
$ cp ./target/debug/cargo ~/.cargo/bin/cargo
使用定制的cargo
重新构建并搜索不同特征构建的crate的迹象(重复运行./scripts/cargo-install-all.sh
对此非常有效)。当确定了有问题的crate时,请将其作为solana-crate-features
的依赖项添加,并包含该crate观察到的所有启用的功能。
附录
此命令将启用一些额外的cargo日志输出,这些输出可以帮助调试依赖问题
export CARGO_LOG=cargo::core::compiler::fingerprint=info
依赖
~17–30MB
~615K SLoC