cargo-hack
A tool to work around some limitations on cargo.
Cargo is a great tool but has some limitations. This tool provides additional flags to avoid some of these limitations.
Installation
cargo install cargo-hackTo install the current cargo-hack requires Rust 1.36 or later.
Usage
cargo-hack is basically wrapper of cargo that propagates subcommand and most of the passed flags to cargo, but provides additional flags and changes the behavior of some existing flags.
-
--each-featurePerform for each feature which includes default features and
--no-default-featuresof the package.This is useful to check that each feature is working properly. (When used for this purpose, it is recommended to use with
--no-dev-depsto avoid cargo#4866.)cargo hack check --each-feature --no-dev-deps
This is a workaround for an issue that cargo does not support for
--featuresand--no-default-featuresflags for sub crates (cargo#3620, cargo#4106, cargo#4463, cargo#4753, cargo#5015, cargo#5364, cargo#6195). -
--feature-powersetPerform for the feature powerset which includes
--no-default-featuresand default features of the package.This is useful to check that every combination of features is working properly. (When used for this purpose, it is recommended to use with
--no-dev-depsto avoid cargo#4866.)cargo hack check --feature-powerset --no-dev-deps
-
--no-dev-depsPerform without dev-dependencies.
This is a workaround for an issue that dev-dependencies leaking into normal build (cargo#4866).
Also, this can be used as a workaround for an issue that
cargodoes not allow publishing a package with cyclic dev-dependencies. (cargo#4242)cargo hack publish --no-dev-deps --dry-run --allow-dirty
Currently, using
--no-dev-depsflag removes dev-dependencies from real manifest while cargo-hack is running and restores it when finished. See cargo#4242 for why this is necessary. Also, this behavior may change in the future on some subcommands. See also #15. -
--remove-dev-depsEquivalent to
--no-dev-depsexcept for does not restore the originalCargo.tomlafter execution.This is useful to know what Cargo.toml that cargo-hack is actually using with
--no-dev-deps.This flag also works without subcommands.
-
--ignore-privateSkip to perform on
publish = falsepackages. -
--ignore-unknown-featuresSkip passing
--featurestocargoif that feature does not exist.This is a workaround for an issue that
cargodoes not support for--featureswith workspace (cargo#3620, cargo#4106, cargo#4463, cargo#4753, cargo#5015, cargo#5364, cargo#6195).This feature was formerly called
--ignore-non-exist-features, but has been renamed. The old name can be used as an alias, but is deprecated.
cargo-hack changes the behavior of the following existing flags.
-
--features,--no-default-featuresUnlike
cargo(cargo#3620, cargo#4106, cargo#4463, cargo#4753, cargo#5015, cargo#5364, cargo#6195), it can also be applied to sub-crates. -
--all,--workspacePerform command for all packages in the workspace.
For example, running
cargo hack check --allin a workspace with membersfooandbarbehaves almost the same as the following script:# If you use cargo-hack, you don't need to maintain this list manually. members=("foo" "bar") for member in ${members[@]}; do cargo check --manifest-path "${member}" done
Workspace members will be performed according to the order of the 'packages' fields of cargo-metadata.
License
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.