cargo-propagate-features
Cargo subcommand to automatically propagate workspace crate features to their dependencies.
What it does
For any crate A with feature X depending on crate B that also has feature X, this tool ensures that crate A's feature X includes "B/X" in its feature dependencies.
This ensures that when you enable a feature on a crate, all its dependencies that have the same feature also get that feature enabled. Without this, enabling a feature might not work correctly because dependencies don't have their corresponding features enabled.
Example
Consider a workspace with three crates:
my-appdepends onmy-libraryandmy-utils- All three crates have the same features:
backend,cli,desktop,web
When you enable the backend feature on my-app, you typically want
the backend features of my-library and my-utils to also be
enabled. This tool automatically adds those feature dependencies.
Before running the tool:
# my-app/Cargo.toml
[]
= { = "../my-library" }
= { = "../my-utils" }
[]
= [] # ❌ Doesn't enable backend features on dependencies
= []
= []
= []
After running the tool:
# my-app/Cargo.toml
[]
= { = "../my-library" }
= { = "../my-utils" }
[]
= ["my-library/backend", "my-utils/backend"] # ✅ Now properly propagates
= ["my-library/cli", "my-utils/cli"]
= ["my-library/desktop", "my-utils/desktop"]
= ["my-library/web", "my-utils/web"]
Now when you build with cargo build --features backend, the backend
features on my-library and my-utils will also be enabled.
Installation
Using cargo-binstall (Recommended)
First install cargo-binstall if you haven't already:
Then install cargo-propagate-features:
Using cargo install
Usage
From the workspace root:
Options
--dry-run: Show what would be changed without modifying files--features <FEATURES>: Comma-separated list of features to propagate (default: backend,cli,desktop,web)--workspace-path <PATH>: Path to workspace root or Cargo.toml (optional, defaults to workspace containing the manifest). When usingcargo run, you can point to a Cargo.toml file directly.--quiet: Suppress output when there are no changes
The command automatically respects Cargo's standard options when
installed and invoked via cargo:
--manifest-path <PATH>: Path to Cargo.toml (automatically handled via cargo_metadata)--package <SPEC>: Work on a specific package (if supported)
License
MIT License - see LICENSE file for details.