fix(uv): resolve unconstrained multi-version packages via lockfile dev-dependencies#890
fix(uv): resolve unconstrained multi-version packages via lockfile dev-dependencies#890
Conversation
…v-dependencies When conflicting dependency groups both include a package without a version specifier, and the lockfile contains multiple versions, the resolution logic failed because normalize_deps only creates defaults for single-version packages and specifier-based matching requires a non-empty specifier. The lockfile's root project package already records per-group resolved versions in its dev-dependencies/dependency-groups section. Use this to build per-group version maps that let unconstrained multi-version packages resolve correctly. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
|
|
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
37f6f38 to
85be6d7
Compare
| for spec in lock_data.get("package", []): | ||
| if normalize_name(spec["name"]) == root_project_name: | ||
| # Handle both old ("dev-dependencies") and new ("dependency-groups") key names | ||
| group_deps_map = spec.get("dev-dependencies", spec.get("dependency-groups", {})) |
There was a problem hiding this comment.
dev has priority over groups? Is that intentional? Should it be tested?
85be6d7 to
2904fdb
Compare

When conflicting dependency groups both include a package without a version
specifier (e.g. just
"build"), and the lockfile contains multiple versions,resolution failed because
normalize_depsonly creates defaults forsingle-version packages and specifier-based matching requires a non-empty
specifier.
The fix reads per-group resolved versions from the lockfile's root project
dev-dependencies/dependency-groupssection and overlays them onto thedefault version map before resolving each group.
Changes are visible to end-users: no
Test plan
uv-unconstrained-conflict-890with intentionally stale lockfilereproducing the scenario (unconstrained
buildresolving to different versionsper group)
test_unconstrainedasserts the pyproject.toml keepsbuildunpinned