Skip to content
A tool to work around some limitations on cargo.
Rust Shell
Branch: master
Clone or download
Latest commit 1aee68c Dec 9, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Use cargo metadata instead of manual manifest validation Nov 10, 2019
ci Cleanup install scripts Nov 6, 2019
src Use Iterator::find instead of for loop Dec 9, 2019
tests Run rustfmt Dec 8, 2019
.editorconfig Initial commit Oct 29, 2019
.gitattributes Initial commit Oct 29, 2019
.gitignore Tweak gitignore Nov 9, 2019
.rustfmt.toml Initial commit Oct 29, 2019
CHANGELOG.md Release 0.3.2 Dec 9, 2019
Cargo.lock Release 0.3.2 Dec 9, 2019
Cargo.toml Release 0.3.2 Dec 9, 2019
LICENSE-APACHE Initial commit Oct 29, 2019
LICENSE-MIT Initial commit Oct 29, 2019
README.md Add `--feature-powerset` subcommand Dec 8, 2019

README.md

cargo-hack

crates-badge license-badge rustc-badge

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-hack

To 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-feature

    Perform for each feature which includes default features and --no-default-features of 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-deps to avoid cargo#4866.)

    cargo hack check --each-feature --no-dev-deps

    This is a workaround for an issue that cargo does not support for --features and --no-default-features flags for sub crates (cargo#3620, cargo#4106, cargo#4463, cargo#4753, cargo#5015, cargo#5364, cargo#6195).

  • --feature-powerset

    Perform for the feature powerset which includes --no-default-features and 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-deps to avoid cargo#4866.)

    cargo hack check --feature-powerset --no-dev-deps
  • --no-dev-deps

    Perform 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 cargo does 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-deps flag 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-deps

    Equivalent to --no-dev-deps except for does not restore the original Cargo.toml after 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-private

    Skip to perform on publish = false packages.

  • --ignore-unknown-features

    Skip passing --features to cargo if that feature does not exist.

    This is a workaround for an issue that cargo does not support for --features with 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-features

    Unlike cargo (cargo#3620, cargo#4106, cargo#4463, cargo#4753, cargo#5015, cargo#5364, cargo#6195), it can also be applied to sub-crates.

  • --all, --workspace

    Perform command for all packages in the workspace.

    For example, running cargo hack check --all in a workspace with members foo and bar behaves 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

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.

You can’t perform that action at this time.