rust-lang/cargo · error · anyhow::Error
failed to parse the version requirement
Error message
failed to parse the version requirement `{}` for dependency `{}` What it means
`Dependency::parse` constructs a `Dependency` from a manifest entry: a name, an optional version string, and a `SourceId`. When `version` is `Some(v)`, it calls `SemVer::VersionReq::parse(v)`; on failure it wraps the parse error with `.context(...)` interpolating both the raw version requirement string and the dependency name. This surfaces malformed version requirements (e.g. invalid operators, bad comparator syntax) with full context about which dependency failed.
Solutions
- Correct the version requirement to valid Cargo/SemVer syntax (e.g. `"1"`, `"1.2"`, `"=1.2.3"`, `"^1.2"`, `">=1.0, <2.0"`).
- Refer to the Cargo SemVer requirement grammar and rewrite the specifier accordingly.
- Remove the version key entirely if any version is acceptable (Cargo treats omission as `*`).
Example fix
# before
[dependencies]
serde = { version = "^=>1.0.0" }
# after
[dependencies]
serde = { version = "1.0.0" } Defensive patterns
Strategy: validation
Validate before calling
use semver::VersionReq;
fn valid_version_req(v: &str) -> bool { VersionReq::parse(v).is_ok() }
// validate dependency version strings before writing them into Cargo.toml
assert!(valid_version_req("1.0.0")); Prevention
- Validate version requirements with `semver::VersionReq::parse` before committing manifests.
- Run `cargo check`/`cargo metadata` in CI to catch manifest parse errors.
- Keep a reference of Cargo SemVer syntax and avoid cross-ecosystem specifiers.
When it happens
Trigger: Declaring a dependency with an unparseable version requirement in `Cargo.toml`, e.g. `serde = { version = "^=>1.0" }` or `req = "1.0.0-alpha.."`. `VersionReq::parse` returns `Err`, triggering the context-wrapped error.
Common situations: Typos in version specifiers, mixing npm/cargo version syntax, trailing operators, incomplete ranges, copy-pasting a version from another ecosystem, or using prerelease/metadata syntax that SemVer rejects.
Understand the failure class
- Parsing and encoding errors: unexpected token, malformed input — why parsers reject input and how to find the real culprit.
Related errors
- can only edit absolute paths, got
- can't find library ` `, rename file to `src/lib.rs` or…
- cannot mix `proc-macro` crate type with others
- cannot override `workspace.lints` in `lints`, either remove…
- cannot specify both `metabuild` and `build`
AI-assisted analysis of rust-lang/cargo@98a09e7e7d (2026-08-11).
Data as JSON: /api/errors/1c133e1a8b39a79d.
Report an issue: GitHub.
Appendix: source
Thrown at src/workspace/dependency.rs:129
DepKind::Build => Some("build"),
}
.serialize(s)
}
}
impl Dependency {
/// Attempt to create a `Dependency` from an entry in the manifest.
pub fn parse(
name: impl Into<InternedString>,
version: Option<&str>,
source_id: SourceId,
) -> CargoResult<Dependency> {
let name = name.into();
let (specified_req, version_req) = match version {
Some(v) => match VersionReq::parse(v) {
Ok(req) => (true, OptVersionReq::Req(req)),
Err(err) => {
return Err(anyhow::Error::new(err).context(format!(
"failed to parse the version requirement `{}` for dependency `{}`",
v, name,
)));
}
},
None => (false, OptVersionReq::Any),
};
let mut ret = Dependency::new_override(name, source_id);
{
let ptr = Arc::make_mut(&mut ret.inner);
ptr.only_match_name = false;
ptr.req = version_req;
ptr.specified_req = specified_req;
}
Ok(ret)
}
View on GitHub (pinned to 98a09e7e7d)