mirror of
https://github.com/astral-sh/uv.git
synced 2025-11-22 04:27:18 +00:00
Respect build constraints in uv sync (#12502)
Some checks are pending
CI / Determine changes (push) Waiting to run
CI / lint (push) Waiting to run
CI / cargo clippy | ubuntu (push) Blocked by required conditions
CI / cargo clippy | windows (push) Blocked by required conditions
CI / cargo dev generate-all (push) Blocked by required conditions
CI / cargo shear (push) Waiting to run
CI / check windows trampoline | i686 (push) Blocked by required conditions
CI / cargo test | ubuntu (push) Blocked by required conditions
CI / cargo test | macos (push) Blocked by required conditions
CI / cargo test | windows (push) Blocked by required conditions
CI / check windows trampoline | aarch64 (push) Blocked by required conditions
CI / check system | python on macos x86-64 (push) Blocked by required conditions
CI / check windows trampoline | x86_64 (push) Blocked by required conditions
CI / test windows trampoline | i686 (push) Blocked by required conditions
CI / test windows trampoline | x86_64 (push) Blocked by required conditions
CI / typos (push) Waiting to run
CI / mkdocs (push) Waiting to run
CI / build binary | linux libc (push) Blocked by required conditions
CI / build binary | linux musl (push) Blocked by required conditions
CI / build binary | macos aarch64 (push) Blocked by required conditions
CI / build binary | macos x86_64 (push) Blocked by required conditions
CI / build binary | windows x86_64 (push) Blocked by required conditions
CI / build binary | windows aarch64 (push) Blocked by required conditions
CI / cargo build (msrv) (push) Blocked by required conditions
CI / build binary | freebsd (push) Blocked by required conditions
CI / ecosystem test | pydantic/pydantic-core (push) Blocked by required conditions
CI / ecosystem test | prefecthq/prefect (push) Blocked by required conditions
CI / ecosystem test | pallets/flask (push) Blocked by required conditions
CI / smoke test | linux (push) Blocked by required conditions
CI / check system | alpine (push) Blocked by required conditions
CI / smoke test | macos (push) Blocked by required conditions
CI / smoke test | windows x86_64 (push) Blocked by required conditions
CI / smoke test | windows aarch64 (push) Blocked by required conditions
CI / integration test | conda on ubuntu (push) Blocked by required conditions
CI / integration test | deadsnakes python3.9 on ubuntu (push) Blocked by required conditions
CI / integration test | free-threaded on linux (push) Blocked by required conditions
CI / integration test | free-threaded on windows (push) Blocked by required conditions
CI / integration test | pypy on ubuntu (push) Blocked by required conditions
CI / integration test | pypy on windows (push) Blocked by required conditions
CI / integration test | graalpy on ubuntu (push) Blocked by required conditions
CI / integration test | graalpy on windows (push) Blocked by required conditions
CI / integration test | github actions (push) Blocked by required conditions
CI / integration test | determine publish changes (push) Blocked by required conditions
CI / integration test | uv publish (push) Blocked by required conditions
CI / integration test | uv_build (push) Blocked by required conditions
CI / check cache | ubuntu (push) Blocked by required conditions
CI / check cache | macos aarch64 (push) Blocked by required conditions
CI / check system | python on debian (push) Blocked by required conditions
CI / check system | python on fedora (push) Blocked by required conditions
CI / check system | python on ubuntu (push) Blocked by required conditions
CI / check system | python on opensuse (push) Blocked by required conditions
CI / check system | python on rocky linux 8 (push) Blocked by required conditions
CI / check system | python on rocky linux 9 (push) Blocked by required conditions
CI / check system | pypy on ubuntu (push) Blocked by required conditions
CI / check system | pyston (push) Blocked by required conditions
CI / check system | python on macos aarch64 (push) Blocked by required conditions
CI / check system | homebrew python on macos aarch64 (push) Blocked by required conditions
CI / check system | python3.10 on windows x86-64 (push) Blocked by required conditions
CI / check system | python3.10 on windows x86 (push) Blocked by required conditions
CI / check system | python3.13 on windows x86-64 (push) Blocked by required conditions
CI / check system | x86-64 python3.13 on windows aarch64 (push) Blocked by required conditions
CI / check system | windows registry (push) Blocked by required conditions
CI / check system | python3.12 via chocolatey (push) Blocked by required conditions
CI / check system | python3.9 via pyenv (push) Blocked by required conditions
CI / check system | python3.13 (push) Blocked by required conditions
CI / check system | conda3.11 on macos aarch64 (push) Blocked by required conditions
CI / check system | conda3.8 on macos aarch64 (push) Blocked by required conditions
CI / check system | conda3.11 on linux x86-64 (push) Blocked by required conditions
CI / check system | conda3.8 on linux x86-64 (push) Blocked by required conditions
CI / check system | conda3.11 on windows x86-64 (push) Blocked by required conditions
CI / check system | conda3.8 on windows x86-64 (push) Blocked by required conditions
CI / check system | amazonlinux (push) Blocked by required conditions
CI / check system | embedded python3.10 on windows x86-64 (push) Blocked by required conditions
CI / benchmarks (push) Blocked by required conditions
Some checks are pending
CI / Determine changes (push) Waiting to run
CI / lint (push) Waiting to run
CI / cargo clippy | ubuntu (push) Blocked by required conditions
CI / cargo clippy | windows (push) Blocked by required conditions
CI / cargo dev generate-all (push) Blocked by required conditions
CI / cargo shear (push) Waiting to run
CI / check windows trampoline | i686 (push) Blocked by required conditions
CI / cargo test | ubuntu (push) Blocked by required conditions
CI / cargo test | macos (push) Blocked by required conditions
CI / cargo test | windows (push) Blocked by required conditions
CI / check windows trampoline | aarch64 (push) Blocked by required conditions
CI / check system | python on macos x86-64 (push) Blocked by required conditions
CI / check windows trampoline | x86_64 (push) Blocked by required conditions
CI / test windows trampoline | i686 (push) Blocked by required conditions
CI / test windows trampoline | x86_64 (push) Blocked by required conditions
CI / typos (push) Waiting to run
CI / mkdocs (push) Waiting to run
CI / build binary | linux libc (push) Blocked by required conditions
CI / build binary | linux musl (push) Blocked by required conditions
CI / build binary | macos aarch64 (push) Blocked by required conditions
CI / build binary | macos x86_64 (push) Blocked by required conditions
CI / build binary | windows x86_64 (push) Blocked by required conditions
CI / build binary | windows aarch64 (push) Blocked by required conditions
CI / cargo build (msrv) (push) Blocked by required conditions
CI / build binary | freebsd (push) Blocked by required conditions
CI / ecosystem test | pydantic/pydantic-core (push) Blocked by required conditions
CI / ecosystem test | prefecthq/prefect (push) Blocked by required conditions
CI / ecosystem test | pallets/flask (push) Blocked by required conditions
CI / smoke test | linux (push) Blocked by required conditions
CI / check system | alpine (push) Blocked by required conditions
CI / smoke test | macos (push) Blocked by required conditions
CI / smoke test | windows x86_64 (push) Blocked by required conditions
CI / smoke test | windows aarch64 (push) Blocked by required conditions
CI / integration test | conda on ubuntu (push) Blocked by required conditions
CI / integration test | deadsnakes python3.9 on ubuntu (push) Blocked by required conditions
CI / integration test | free-threaded on linux (push) Blocked by required conditions
CI / integration test | free-threaded on windows (push) Blocked by required conditions
CI / integration test | pypy on ubuntu (push) Blocked by required conditions
CI / integration test | pypy on windows (push) Blocked by required conditions
CI / integration test | graalpy on ubuntu (push) Blocked by required conditions
CI / integration test | graalpy on windows (push) Blocked by required conditions
CI / integration test | github actions (push) Blocked by required conditions
CI / integration test | determine publish changes (push) Blocked by required conditions
CI / integration test | uv publish (push) Blocked by required conditions
CI / integration test | uv_build (push) Blocked by required conditions
CI / check cache | ubuntu (push) Blocked by required conditions
CI / check cache | macos aarch64 (push) Blocked by required conditions
CI / check system | python on debian (push) Blocked by required conditions
CI / check system | python on fedora (push) Blocked by required conditions
CI / check system | python on ubuntu (push) Blocked by required conditions
CI / check system | python on opensuse (push) Blocked by required conditions
CI / check system | python on rocky linux 8 (push) Blocked by required conditions
CI / check system | python on rocky linux 9 (push) Blocked by required conditions
CI / check system | pypy on ubuntu (push) Blocked by required conditions
CI / check system | pyston (push) Blocked by required conditions
CI / check system | python on macos aarch64 (push) Blocked by required conditions
CI / check system | homebrew python on macos aarch64 (push) Blocked by required conditions
CI / check system | python3.10 on windows x86-64 (push) Blocked by required conditions
CI / check system | python3.10 on windows x86 (push) Blocked by required conditions
CI / check system | python3.13 on windows x86-64 (push) Blocked by required conditions
CI / check system | x86-64 python3.13 on windows aarch64 (push) Blocked by required conditions
CI / check system | windows registry (push) Blocked by required conditions
CI / check system | python3.12 via chocolatey (push) Blocked by required conditions
CI / check system | python3.9 via pyenv (push) Blocked by required conditions
CI / check system | python3.13 (push) Blocked by required conditions
CI / check system | conda3.11 on macos aarch64 (push) Blocked by required conditions
CI / check system | conda3.8 on macos aarch64 (push) Blocked by required conditions
CI / check system | conda3.11 on linux x86-64 (push) Blocked by required conditions
CI / check system | conda3.8 on linux x86-64 (push) Blocked by required conditions
CI / check system | conda3.11 on windows x86-64 (push) Blocked by required conditions
CI / check system | conda3.8 on windows x86-64 (push) Blocked by required conditions
CI / check system | amazonlinux (push) Blocked by required conditions
CI / check system | embedded python3.10 on windows x86-64 (push) Blocked by required conditions
CI / benchmarks (push) Blocked by required conditions
## Summary There are still a few missing sites that we need to audit: - `uv tool install` (https://github.com/astral-sh/uv/issues/12496) - `uv tool run` (https://github.com/astral-sh/uv/issues/12496) - The `--with` dependencies in `uv run --with` (https://github.com/astral-sh/uv/issues/12505) Closes #12441.
This commit is contained in:
parent
50cf7d19b0
commit
9e10f83ce7
17 changed files with 273 additions and 13 deletions
|
|
@ -19,7 +19,7 @@ use tracing::debug;
|
|||
use url::Url;
|
||||
|
||||
use uv_cache_key::RepositoryUrl;
|
||||
use uv_configuration::BuildOptions;
|
||||
use uv_configuration::{BuildOptions, Constraints};
|
||||
use uv_distribution::{DistributionDatabase, FlatRequiresDist};
|
||||
use uv_distribution_filename::{
|
||||
BuildTag, DistExtension, ExtensionError, SourceDistExtension, WheelFilename,
|
||||
|
|
@ -674,6 +674,17 @@ impl Lock {
|
|||
&self.manifest.dependency_groups
|
||||
}
|
||||
|
||||
/// Returns the build constraints that were used to generate this lock.
|
||||
pub fn build_constraints(&self, root: &Path) -> Constraints {
|
||||
Constraints::from_requirements(
|
||||
self.manifest
|
||||
.build_constraints
|
||||
.iter()
|
||||
.cloned()
|
||||
.map(|requirement| requirement.to_absolute(root)),
|
||||
)
|
||||
}
|
||||
|
||||
/// Return the workspace root used to generate this lock.
|
||||
pub fn root(&self) -> Option<&Package> {
|
||||
self.packages.iter().find(|package| {
|
||||
|
|
@ -931,6 +942,26 @@ impl Lock {
|
|||
manifest_table.insert("overrides", value(overrides));
|
||||
}
|
||||
|
||||
if !self.manifest.build_constraints.is_empty() {
|
||||
let build_constraints = self
|
||||
.manifest
|
||||
.build_constraints
|
||||
.iter()
|
||||
.map(|requirement| {
|
||||
serde::Serialize::serialize(
|
||||
&requirement,
|
||||
toml_edit::ser::ValueSerializer::new(),
|
||||
)
|
||||
})
|
||||
.collect::<Result<Vec<_>, _>>()?;
|
||||
let build_constraints = match build_constraints.as_slice() {
|
||||
[] => Array::new(),
|
||||
[requirement] => Array::from_iter([requirement]),
|
||||
build_constraints => each_element_on_its_line_array(build_constraints.iter()),
|
||||
};
|
||||
manifest_table.insert("build-constraints", value(build_constraints));
|
||||
}
|
||||
|
||||
if !self.manifest.dependency_groups.is_empty() {
|
||||
let mut dependency_groups = Table::new();
|
||||
for (extra, requirements) in &self.manifest.dependency_groups {
|
||||
|
|
@ -1188,6 +1219,7 @@ impl Lock {
|
|||
requirements: &[Requirement],
|
||||
constraints: &[Requirement],
|
||||
overrides: &[Requirement],
|
||||
build_constraints: &[Requirement],
|
||||
dependency_groups: &BTreeMap<GroupName, Vec<Requirement>>,
|
||||
dependency_metadata: &DependencyMetadata,
|
||||
indexes: Option<&IndexLocations>,
|
||||
|
|
@ -1279,6 +1311,27 @@ impl Lock {
|
|||
}
|
||||
}
|
||||
|
||||
// Validate that the lockfile was generated with the same build constraints.
|
||||
{
|
||||
let expected: BTreeSet<_> = build_constraints
|
||||
.iter()
|
||||
.cloned()
|
||||
.map(|requirement| normalize_requirement(requirement, root))
|
||||
.collect::<Result<_, _>>()?;
|
||||
let actual: BTreeSet<_> = self
|
||||
.manifest
|
||||
.build_constraints
|
||||
.iter()
|
||||
.cloned()
|
||||
.map(|requirement| normalize_requirement(requirement, root))
|
||||
.collect::<Result<_, _>>()?;
|
||||
if expected != actual {
|
||||
return Ok(SatisfiesResult::MismatchedBuildConstraints(
|
||||
expected, actual,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
// Validate that the lockfile was generated with the dependency groups.
|
||||
{
|
||||
let expected: BTreeMap<GroupName, BTreeSet<Requirement>> = dependency_groups
|
||||
|
|
@ -1685,6 +1738,8 @@ pub enum SatisfiesResult<'lock> {
|
|||
MismatchedConstraints(BTreeSet<Requirement>, BTreeSet<Requirement>),
|
||||
/// The lockfile uses a different set of overrides.
|
||||
MismatchedOverrides(BTreeSet<Requirement>, BTreeSet<Requirement>),
|
||||
/// The lockfile uses a different set of build constraints.
|
||||
MismatchedBuildConstraints(BTreeSet<Requirement>, BTreeSet<Requirement>),
|
||||
/// The lockfile uses a different set of dependency groups.
|
||||
MismatchedDependencyGroups(
|
||||
BTreeMap<GroupName, BTreeSet<Requirement>>,
|
||||
|
|
@ -1765,6 +1820,9 @@ pub struct ResolverManifest {
|
|||
/// The overrides provided to the resolver.
|
||||
#[serde(default)]
|
||||
overrides: BTreeSet<Requirement>,
|
||||
/// The build constraints provided to the resolver.
|
||||
#[serde(default)]
|
||||
build_constraints: BTreeSet<Requirement>,
|
||||
/// The static metadata provided to the resolver.
|
||||
#[serde(default)]
|
||||
dependency_metadata: BTreeSet<StaticMetadata>,
|
||||
|
|
@ -1778,6 +1836,7 @@ impl ResolverManifest {
|
|||
requirements: impl IntoIterator<Item = Requirement>,
|
||||
constraints: impl IntoIterator<Item = Requirement>,
|
||||
overrides: impl IntoIterator<Item = Requirement>,
|
||||
build_constraints: impl IntoIterator<Item = Requirement>,
|
||||
dependency_groups: impl IntoIterator<Item = (GroupName, Vec<Requirement>)>,
|
||||
dependency_metadata: impl IntoIterator<Item = StaticMetadata>,
|
||||
) -> Self {
|
||||
|
|
@ -1786,6 +1845,7 @@ impl ResolverManifest {
|
|||
requirements: requirements.into_iter().collect(),
|
||||
constraints: constraints.into_iter().collect(),
|
||||
overrides: overrides.into_iter().collect(),
|
||||
build_constraints: build_constraints.into_iter().collect(),
|
||||
dependency_groups: dependency_groups
|
||||
.into_iter()
|
||||
.map(|(group, requirements)| (group, requirements.into_iter().collect()))
|
||||
|
|
@ -1813,6 +1873,11 @@ impl ResolverManifest {
|
|||
.into_iter()
|
||||
.map(|requirement| requirement.relative_to(root))
|
||||
.collect::<Result<BTreeSet<_>, _>>()?,
|
||||
build_constraints: self
|
||||
.build_constraints
|
||||
.into_iter()
|
||||
.map(|requirement| requirement.relative_to(root))
|
||||
.collect::<Result<BTreeSet<_>, _>>()?,
|
||||
dependency_groups: self
|
||||
.dependency_groups
|
||||
.into_iter()
|
||||
|
|
@ -2375,11 +2440,8 @@ impl Package {
|
|||
url.set_query(None);
|
||||
|
||||
// Reconstruct the `GitUrl` from the `GitSource`.
|
||||
let git_url = uv_git_types::GitUrl::from_commit(
|
||||
url,
|
||||
GitReference::from(git.kind.clone()),
|
||||
git.precise,
|
||||
)?;
|
||||
let git_url =
|
||||
GitUrl::from_commit(url, GitReference::from(git.kind.clone()), git.precise)?;
|
||||
|
||||
// Reconstruct the PEP 508-compatible URL from the `GitSource`.
|
||||
let url = Url::from(ParsedGitUrl {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue