Skip to content

cargo install cargo-edit --no-default-features fails to compile #947

Description

@zacknewman
[zack@laptop ~]$ cargo install cargo-edit --no-default-features
⋮
error[E0433]: failed to resolve: use of unresolved module or unlinked crate `clap`
  --> /home/zack/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/cargo-edit-0.13.7/src/errors.rs:55:11
   |
55 | impl From<clap::Error> for CliError {
   |           ^^^^ use of unresolved module or unlinked crate `clap`
   |
   = help: if you wanted to use a crate named `clap`, use `cargo add clap` to add it to your `Cargo.toml`

error[E0433]: failed to resolve: use of unresolved module or unlinked crate `clap`
  --> /home/zack/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/cargo-edit-0.13.7/src/errors.rs:56:18
   |
56 |     fn from(err: clap::Error) -> CliError {
   |                  ^^^^ use of unresolved module or unlinked crate `clap`
   |
   = help: if you wanted to use a crate named `clap`, use `cargo add clap` to add it to your `Cargo.toml`

For more information about this error, try `rustc --explain E0433`.
error: could not compile `cargo-edit` (lib) due to 2 previous errors
warning: build failed, waiting for other jobs to finish...
error: failed to compile `cargo-edit v0.13.7`, intermediate artifacts can be found at `/tmp/cargo-installgFtuDU`.
To reuse those artifacts with a future compilation, set the environment variable `CARGO_TARGET_DIR` to that path.

Machine info:

[zack@laptop ~]$ uname -a
Linux laptop 6.16.3-arch1-1 #1 SMP PREEMPT_DYNAMIC Sat, 23 Aug 2025 15:32:49 +0000 x86_64 GNU/Linux
[zack@laptop ~]$ cargo -V
cargo 1.89.0 (c24e10642 2025-06-23)

If one must enable certain features, ideally compile_error would be used informing a user the minimum set of features that must be enabled; otherwise any use of clap should be gated behind a cfg attribute based on the set of features that enable it.

Activity

  1. epage commented on Aug 27, 2025

    @epage
    Collaborator

    While this is a bug, its relatively minor in my opinion.

    The big issue is that cargo does not report the error about nothing to install until after it has compiled things

    $ cargo install pulldown-cmark --no-default-features
        Updating crates.io index
      Installing pulldown-cmark v0.13.0
        Updating crates.io index
         Locking 3 packages to latest compatible versions
       Compiling pulldown-cmark v0.13.0
       Compiling bitflags v2.9.3
       Compiling unicase v2.8.1
       Compiling memchr v2.7.5
        Finished `release` profile [optimized] target(s) in 2.12s
    warning: none of the package's binaries are available for install using the selected features
      bin "pulldown-cmark" requires the features: `getopts`
      example "broken-link-callbacks" requires the features: `html`
      example "event-filter" requires the features: `html`
      example "events" requires the features:
      example "footnote-rewrite" requires the features: `html`
      example "normalize-wikilink" requires the features: `html`
      example "parser-map-event-print" requires the features: `html`
    2 more targets also requires features not enabled. See them in the Cargo.toml file.
    Consider enabling some of the needed features by passing, e.g., `--features="getopts"`

    This is being tracked in rust-lang/cargo#8970

  2. zacknewman commented on Aug 27, 2025

    @zacknewman
    Author

    I'm unsure I understand. I cloned the repo and added a simple #[cfg(feature = "cli")] to the mentioned From impl, and cargo build --release --no-default-features compiles just fine. Are you saying that it shouldn't compile at all if cli is not enabled or that cargo-edit is useless without at least that feature enabled? If so, then compile_error would still be appropriate in my opinion.

  3. epage commented on Aug 27, 2025

    @epage
    Collaborator

    cargo build --release --no-default-features will build but cargo install --release --no-default-features will error because all of the binaries require some feature to be enabled.

    cargo-edit is a library (which is all that is left without features) is not generally a priority, see https://docs.rs/cargo-edit/latest/cargo_edit/#semver-compatibility

    The right fix is adding the appropriate #[cfg]s, its just a low priority for me to do anything about it.

  4. zacknewman commented on Aug 27, 2025

    @zacknewman
    Author

    OK, can you tell me what the minimum set of features are for the binary? Is cli enough?

  5. epage commented on Aug 27, 2025

    @epage
    Collaborator

    We have a feature per binary, see

    cargo-edit/Cargo.toml

    Lines 38 to 56 in d722ed8

    [[bin]]
    name = "cargo-add"
    path = "src/bin/add/main.rs"
    required-features = ["add"]
    [[bin]]
    name = "cargo-rm"
    path = "src/bin/rm/main.rs"
    required-features = ["rm"]
    [[bin]]
    name = "cargo-upgrade"
    path = "src/bin/upgrade/main.rs"
    required-features = ["upgrade"]
    [[bin]]
    name = "cargo-set-version"
    path = "src/bin/set-version/main.rs"
    required-features = ["set-version"]

  6. 2bndy5 commented on Sep 11, 2025

    @2bndy5

    You can set a compiler_error in lib.rs to short-circuit erroneous compilation:

    #[cfg(not(feature = "cli"))]
    {
        compile_error!("At least 1 feature is required to install");
    }

    This would help avoid duplicate issues in the future and provide a more meaningful error message.

    Please disregard if this crate is intended to be a lib crate as well as a binary crate.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions