Git Product home page Git Product logo

cargo-all-features's Introduction

cargo-all-features

Cargo subcommands that build and test all feature flag combinations for a crate.

Install

cargo install cargo-all-features

# or via cargo-binstall
cargo binstall cargo-all-features

Usage

The following commands can be run within a Cargo package or at the root of a Cargo workspace.

Build crate with all feature flag combinations:

cargo all-features build -- <CARGO BUILD FLAGS>

Check crate with all feature flag combinations:

cargo all-features check -- <CARGO CHECK FLAGS>

Test crate with all feature flag combinations:

cargo all-features test -- <CARGO TEST FLAGS>
Supported tools

for more information run cargo all-features --help

Additional Features

Chunking

If certain projects, features might add up and CI jobs can take longer. In order to shrink wall time of your builds you can specify --chunks (the total amount of junks to split into [1..]) and --chunk (the chunk nr of the one executed command [1..<CHUNKS>]) per execution.

I.e. in github you can use a job matrix:

name: CI

on: [pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        chunk: [1,2,3,4]
        chunks: 4
    steps:
    - uses: actions/checkout@v2
    - name: Install stable toolchain
        uses: actions-rs/toolchain@v1
        with:
          profile: minimal
          toolchain: stable
          override: true
     - name: Install cargo-all-features
        uses: actions-rs/cargo@v1
        with:
          command: install
          args: cargo-all-features --version 1.8.0
    - name: Build all features for release
      run: cargo all-features build --chunks  ${{matrix.chunks}} --chunk  ${{matrix.chunk}} -- --release

Dry run & Verbosity

You are not sure if you configured something correct but don't have the time to wait for all tests or builds? Use --dry-run, it will skip all command execution.

If you are not sure if the correct command are executed use --verbose

RustUp toolchain

Don't mind to use +<toolchain> or any other combination of rustups toolchain selection. cargo-all-features will pick up on the active toolchain and use it.

for more information run cargo all-features --help

Cross

If you never heard of cross, an almost zero setup cross compilation cli setup

While there is no way to directly know if you are calling this cargo subcommand from cross, there is a --target-command flag which can be set to cross which will forward the feature flags to cross instead of cargo

Why?

If you have a crate that utilizes Rust feature flags, it’s common to set up a test matrix in your continuous integration tooling to individually test all feature flags. This setup can be difficult to maintain and easy to forget to update as feature flags come and go. It’s also not exhaustive, as it’s possible enabling combinations of feature flags could result in a compilation error that should be fixed. This utility was built to address these concerns.

Options

You can add the following options to your Cargo.toml file to configure the behavior of cargo-all-features under the heading [package.metadata.cargo-all-features]:

[package.metadata.cargo-all-features]

# Features "foo" and "bar" are incompatible, so skip permutations including them
skip_feature_sets = [
    ["foo", "bar"],
]

# If your crate has a large number of optional dependencies, skip them for speed
skip_optional_dependencies = true

# Add back certain optional dependencies that you want to include in the permutations
extra_features = [
    "log",
]

# Exclude certain features from the build matrix
denylist = ["foo", "bar"]

# Always include one of the features of a list in combinations.
# Not all features of one list should be included in `skip_feature_sets` or `denylist`.
always_include_features = [
    ["baz"], # always include baz
    ["foo", "bar"] # always include either foo or bar
]

# The maximum number of features to try at once. Does not count features from `always_include_features`.
# This is useful for reducing the number of combinations run for a crate with a large amount of features,
# since in most cases a bug just needs a small set of 2-3 features to reproduce.
max_combination_size = 4

# Only include certain features in the build matrix
#(incompatible with `denylist`, `skip_optional_dependencies`, and `extra_features`)
allowlist = ["foo", "bar"]

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.

cargo-all-features's People

Contributors

byron avatar frewsxcv avatar manishearth avatar nicolasklenert avatar oherrala avatar person-93 avatar robertbastian avatar sffc avatar somehowchris avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.