cargo-hack 0.3.1

A tool to work around some limitations on cargo.
cargo-hack-0.3.1 is not a library.

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).

  • --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.