Rustdoc uses crate name as a base for file names (target/doc/$name.json), but this naming scheme is incompatible with Cargo projects where names are not unique, and multiple different crates can have the same name.
[package]
name = "exampledoc" # try `name = "wild"` for extra difficulty
edition = "2024"
[dependencies]
old = { package = "wild", version = "1" }
new = { package = "wild", version = "2" }
pub use ::old;
pub use ::new;
RUSTDOCFLAGS="-Z unstable-options --output-format=json" cargo +nightly doc
This ends up writing target/doc/wild.json for only one of the two versions. The same problem can happen if Cargo has git, path, or custom registry dependencies that use names overlapping with crates-io dependencies, so even name + version isn't unique.
Using the package alias (new and old in this example) wouldn't be sufficient, because these aliases aren't globally unique either. Different crates in the same dependency tree can rename different deps to the same name.
cargo 1.89.0-nightly (fc1518ef0 2025-06-06)
Rustdoc uses crate name as a base for file names (
target/doc/$name.json), but this naming scheme is incompatible with Cargo projects where names are not unique, and multiple different crates can have the same name.RUSTDOCFLAGS="-Z unstable-options --output-format=json" cargo +nightly docThis ends up writing
target/doc/wild.jsonfor only one of the two versions. The same problem can happen if Cargo hasgit,path, or custom registry dependencies that use names overlapping with crates-io dependencies, so even name + version isn't unique.Using the package alias (
newandoldin this example) wouldn't be sufficient, because these aliases aren't globally unique either. Different crates in the same dependency tree can rename different deps to the same name.cargo 1.89.0-nightly (fc1518ef0 2025-06-06)