rust-lang/cargo · error · anyhow::Error

you can't generate a lockfile for an empty workspace.

Error message

you can't generate a lockfile for an empty workspace.

What it means

update_lockfile requires at least one workspace member to resolve dependencies for. If ws.members().count() == 0 (a virtual manifest with no members, or all members excluded) it bails at cargo_update.rs:66 — there is nothing to put in a lockfile.

Source

Thrown at src/ops/cargo_update.rs:66

        &CliFeatures::new_all(true),
        HasDevUnits::Yes,
        previous_resolve,
        None,
        &[],
        true,
    )?;
    ops::write_pkg_lockfile(ws, &mut resolve)?;
    print_lockfile_changes(ws, previous_resolve, &resolve, &mut registry)?;
    Ok(())
}

pub fn update_lockfile(ws: &Workspace<'_>, opts: &UpdateOptions<'_>) -> CargoResult<()> {
    if opts.recursive && opts.precise.is_some() {
        anyhow::bail!("cannot specify both recursive and precise simultaneously")
    }

    if ws.members().count() == 0 {
        anyhow::bail!("you can't generate a lockfile for an empty workspace.")
    }

    // Updates often require a lot of modifications to the registry, so ensure
    // that we're synchronized against other Cargos.
    let _lock = ws
        .gctx()
        .acquire_package_cache_lock(CacheLockMode::DownloadExclusive)?;

    let previous_resolve = match ops::load_pkg_lockfile(ws)? {
        Some(resolve) => resolve,
        None => {
            match opts.precise {
                None => return generate_lockfile(ws),

                // Precise option specified, so calculate a previous_resolve required
                // by precise package update later.
                Some(_) => {
                    let mut registry = ws.package_registry()?;

View on GitHub (pinned to 0e07a15537)

Solutions

  1. Add at least one member crate to the workspace (create a crate and list it under [workspace] members).
  2. Fix member/exclude globs so at least one real package resolves.
  3. Run `cargo update` from inside an actual package directory instead of the virtual root.

Example fix

# before
[workspace]
members = []

$ cargo update
error: you can't generate a lockfile for an empty workspace.

# after
[workspace]
members = ["crates/*"]
# and ensure crates/my-crate/Cargo.toml exists with [package]
Defensive patterns

Strategy: validation

Validate before calling

# Require at least one workspace member before updating:
count=$(cargo metadata --no-deps --format-version 1 2>/dev/null \
  | jq '.packages|length')
if [ "${count:-0}" -eq 0 ]; then
  echo "empty workspace; add a member crate" >&2; exit 1
fi
cargo update

Prevention

When it happens

Trigger: Running `cargo update` in a virtual workspace whose `members = []` is empty or whose globs/excludes resolve to zero crates.

Common situations: Brand-new workspace before any member crate exists; over-aggressive `exclude` patterns removing all members; `default-members` set but `members` empty.

Related errors


AI-assisted analysis of rust-lang/cargo@0e07a15537 (2026-08-06). Data as JSON: /data/errors/2129f037e62f0f96.json. Report an issue: GitHub.