{"id":"da80fdfc03aabfc6","repo":"rust-lang/cargo","slug":"replacements-must-specify-a-version-to-replace-bu","errorCode":null,"errorMessage":"replacements must specify a version to replace, but `{}` does not","messagePattern":"replacements must specify a version to replace, but `(.+?)` does not","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/workspace/parser/mod.rs","lineNumber":2136,"sourceCode":"                     version to replace, but `{}` does not\",\n                spec\n            )\n        })?;\n        if spec.url().is_none() {\n            spec.set_url(CRATES_IO_INDEX.parse().unwrap());\n        }\n\n        if replacement.is_version_specified() {\n            bail!(\n                \"replacements cannot specify a version \\\n                     requirement, but found one for `{}`\",\n                spec\n            );\n        }\n\n        let mut dep = dep_to_dependency(replacement, spec.name(), manifest_ctx, None)?;\n        let version = spec.version().ok_or_else(|| {\n            anyhow!(\n                \"replacements must specify a version \\\n                     to replace, but `{}` does not\",\n                spec\n            )\n        })?;\n        unused_dep_keys(\n            dep.name_in_toml().as_str(),\n            \"replace\",\n            replacement.unused_keys(),\n            &mut manifest_ctx.warnings,\n        );\n        dep.set_version_req(OptVersionReq::exact(&version));\n        replace.push((spec, dep));\n    }\n    Ok(replace)\n}\n\nfn patch(","sourceCodeStart":2118,"sourceCodeEnd":2154,"githubUrl":"https://github.com/rust-lang/cargo/blob/0e07a155371a6ce88ae53a2c00df940280c09a67/src/workspace/parser/mod.rs#L2118-L2154","documentation":"Thrown by the `replace` function at src/workspace/parser/mod.rs:2136. A `[replace]` entry key must be a fully-qualified package spec of the form `name@version` (and that version must be a concrete version, not a requirement). After `PackageIdSpec::parse` succeeds, cargo checks `spec.version()`; if it is `None` (the key had no `@version` part) parsing bails.","triggerScenarios":"A `[replace]` table with a key like `serde = { ... }` instead of `serde@1.0.197 = { ... }`. Reached when the spec parses but carries no version component.","commonSituations":"Confusing `[replace]` with `[patch]` (patch takes a bare name, replace needs `name@version`); copy-paste from outdated docs; forgetting the `@version` suffix.","solutions":["Add the exact version to replace: `[replace] serde@1.0.197 = { git = \"...\" }`.","Prefer `[patch]` for most modern use cases, which does not require pinning a version in the key.","Ensure the version is concrete (e.g. `1.0.197`), not a requirement (`^1`)."],"exampleFix":"# before\n[replace]\nserde = { git = \"https://...\" }\n# after\n[replace]\nserde@1.0.197 = { git = \"https://...\" }","handlingStrategy":"validation","validationCode":"for (spec_key, _v) in replace_table {\n    if !spec_key.contains('@') {\n        return Err(format!(\"replace key {spec_key} must be name@version\"));\n    }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always use `name@version` for `[replace]` keys.","Prefer `[patch]` unless you specifically need replace semantics.","Ensure the version is concrete, not a requirement."],"tags":["manifest","replace","dependencies"],"analyzedSha":"0e07a155371a6ce88ae53a2c00df940280c09a67","analyzedAt":"2026-08-06T01:46:58.334Z","schemaVersion":2}