9 releases (4 breaking)
0.5.1 | Feb 11, 2023 |
---|---|
0.5.0 | Feb 10, 2023 |
0.4.1 | Feb 7, 2023 |
0.3.2 | Jan 31, 2023 |
0.1.0 | Jan 27, 2023 |
#46 in #fix
36KB
721 lines
Features
Understand why and how features are enabled in a rust workspace. Feature
is able to automatically fix missing feature propagation to dependencies. Eventually it will be ready for CI use to check an MR for consistent feature usage.
Install
cargo install -f feature
Example - Fixing feature propagation
Let's check that the runtime-benchmarks
feature is properly passed down to all the dependencies of the frame-support
crate in the workspace of Substrate:
feature lint propagate-feature --manifest-path ../substrate/Cargo.toml --feature runtime-benchmarks --workspace -p frame-support
The output reveals that there are some dependencies that expose the feature but don't get it passed down:
Analyzing workspace
crate "frame-support"
feature "runtime-benchmarks"
must propagate to:
frame-system
sp-runtime
sp-staking
Generated 1 errors and 0 warnings and fixed 0 issues.
Without the -p
it will detect many more problems. You can verify this for the frame-support which is indeed missing the feature for sp-runtime
while that is clearly sp-runtime it 🤔.
This can be fixed by applying the --fix
flag like:
feature lint propagate-feature --manifest-path ../substrate/Cargo.toml --feature runtime-benchmarks --workspace -p frame-support --fix
Which results in this diff:
-runtime-benchmarks = []
+runtime-benchmarks = [
+ "frame-system/runtime-benchmarks",
+ "sp-runtime/runtime-benchmarks",
+ "sp-staking/runtime-benchmarks"
+]
The auto-fix is currently a bit coarse, and does not check for optional dependencies. It will also not add the feature to crates that do not have it, but need it because of a dependency. This will be fixed soon.
Example - Dependency tracing
Recently there was a build error in the Substrate master CI which was caused by a downstream dependency snow
. To investigate this, it is useful to see how Substrate depends on it.
Let's find out how node-cli
depends on snow
:
feature trace --manifest-path substrate/Cargo.toml node-cli snow
output:
node-cli -> try-runtime-cli -> substrate-rpc-client -> sc-rpc-api ->sc-chain-spec -> sc-telemetry -> libp2p -> libp2p-webrtc -> libp2p-noise -> snow
So it comes from libp2p, okay. Good to know.
Roadmap
- Add feature information to the enabled deps
- Allow manual skipping of dev dependencies (currently always skipped)
- Introduce filters for versions and features for argument
to
- Optimize
shortest_path
function - Create lint rules which can be used to validate that certain constraints in the work-space hold
Dependencies
~6.5–9MB
~161K SLoC