Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of #3369 - joshtriplett:cargo-install-only-required-depend…
…encies, r=alexcrichton cargo fails if it can't find optional dependencies, even if corresponding feature not enabled I have a directory registry containing all the crate sources needed to build an application crate (for instance, ripgrep), and a `$CARGO_HOME/config` file that looks like this: ```toml [source.crates-io] replace-with = "dh-cargo-registry" [source.dh-cargo-registry] directory = "/usr/share/cargo/registry/" ``` When I attempt to build ripgrep via "cargo install ripgrep" from that directory registry, I get this error: ``` error: failed to compile `ripgrep v0.3.1`, intermediate artifacts can be found at `/tmp/cargo-install.rmKApOw9BwAL` Caused by: no matching package named `simd` found (required by `bytecount`) location searched: registry https://github.com/rust-lang/crates.io-index version required: ^0.1.1 ``` The directory registry indeed does not contain "simd"; however, bytecount doesn't require simd. It has an optional dependency on simd, and nothing enables the feature that requires that dependency. Placing the simd crate sources into the directory registry allows ripgrep to build; the resulting build does not actually build the simd crate. I can reproduce this by just trying to build the "bytecount" crate directly, using the same `$CARGO_HOME`: ``` error: no matching package named `simd` found (required by `bytecount`) location searched: registry https://github.com/rust-lang/crates.io-index version required: = 0.1.1 ``` (Incidentally, that "version required" seems wrong: bytecount has an optional dependency on simd `^0.1.1`, not `=0.1.1`.) However, this doesn't seem consistent with other crates in the same dependency tree. For instance, ripgrep also depends on clap, and clap has an optional dependency on yaml-rust, yet cargo does not complain about the missing yaml-rust. I'd *guess* that the difference occurs because ripgrep has an optional feature `simd-accel` that depends on `bytecount/simd-accel`, so cargo wants to compute what packages it needs for that case too, even when building without that feature. (Similar to #3233.) However, this makes it impossible to build a package while installing only the packaged dependencies for the enabled features. Could `cargo install` ignore any dependencies not actually required by the enabled feature? (That behavior would make no sense for "cargo build", which builds a Cargo.lock file that should remain consistent regardless of enabled features, but it makes sense for "cargo install cratename", which doesn't build a Cargo.lock file.)
- Loading branch information