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
To install the current cargo-hack requires Rust 1.36 or later.
cargo-hack is usually runnable with Cargo versions older than the Rust version required for installation (e.g., cargo +1.31.0 hack check). To run the current cargo-hack requires Cargo 1.26 or later.
Usage
See cargo hack --help for a complete list of options (output is here).
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 rust-lang/cargo#4866.) -
--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 rust-lang/cargo#4866.) -
--no-dev-depsPerform without dev-dependencies.
This is a workaround for an issue that dev-dependencies leaking into normal build (rust-lang/cargo#4866).
Also, this can be used as a workaround for an issue that
cargodoes not allow publishing a package with cyclic dev-dependencies. (rust-lang/cargo#4242)Note: Currently, using
--no-dev-depsflag removes dev-dependencies from real manifest while cargo-hack is running and restores it when finished. See rust-lang/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 feature was formerly called
--ignore-non-exist-features, but has been renamed. -
--clean-per-runRemove artifacts for that package before running the command.
The following flags can be used with --each-feature and --feature-powerset.
-
--optional-depsUse optional dependencies as features.
-
--exclude-features,--skipSpace-separated list of features to exclude.
-
--depthSpecify a max number of simultaneous feature flags of
--feature-powerset.If the number is set to 1,
--feature-powersetis equivalent to--each-feature. -
--group-featuresSpace-separated list of features to group.
To specify multiple groups, use this option multiple times:
--group-features a,b --group-features c,d
cargo-hack changes the behavior of the following existing flags.
-
--features,--no-default-featuresUnlike
cargo(rust-lang/cargo#3620, rust-lang/cargo#4106, rust-lang/cargo#4463, rust-lang/cargo#4753, rust-lang/cargo#5015, rust-lang/cargo#5364, rust-lang/cargo#6195), it can also be applied to sub-crates. -
--all,--workspacePerform command for all packages in the workspace.
Unlike cargo, it does not compile all members at once.
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; do doneWorkspace 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 or MIT license 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.