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神奇豆 中排名

Download history 920/week @ 2024-03-13 584/week @ 2024-03-20 761/week @ 2024-03-27 938/week @ 2024-04-03 440/week @ 2024-04-10 705/week @ 2024-04-17 742/week @ 2024-04-24 465/week @ 2024-05-01 589/week @ 2024-05-08 633/week @ 2024-05-15 653/week @ 2024-05-22 924/week @ 2024-05-29 609/week @ 2024-06-05 468/week @ 2024-06-12 587/week @ 2024-06-19 471/week @ 2024-06-26

2,231 每月下载量

Apache-2.0

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