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
- Add at least one member crate to the workspace (create a crate and list it under [workspace] members).
- Fix member/exclude globs so at least one real package resolves.
- 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
- Ensure [workspace] members globs resolve to at least one package.
- Run `cargo update` from inside a real package if the root is virtual.
- Double-check `exclude` patterns aren't removing all members.
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
- package `{}` cannot be tested because it requires dev-depend
- {}package(s) `{}` not found in workspace `{}`
- no library targets found in packages: {}
- found a virtual manifest at `{}` instead of a package manife
- cannot specify both recursive and precise simultaneously
AI-assisted analysis of rust-lang/cargo@0e07a15537 (2026-08-06).
Data as JSON: /data/errors/2129f037e62f0f96.json.
Report an issue: GitHub.