mirror of
https://github.com/astral-sh/uv.git
synced 2025-10-27 18:36:44 +00:00
Avoid building packages with dynamic versions (#4058)
## Summary This PR separates "gathering the requirements" from the rest of the metadata (e.g., version), which isn't required when installing a package's _dependencies_ (as opposed to installing the package itself). It thus ensures that we don't need to build a package when a static `pyproject.toml` is provided in `pip compile`. Closes https://github.com/astral-sh/uv/issues/4040.
This commit is contained in:
parent
a0173760f1
commit
191f9556b7
8 changed files with 609 additions and 382 deletions
|
|
@ -39,7 +39,7 @@ use crate::metadata::{ArchiveMetadata, Metadata};
|
|||
use crate::reporter::Facade;
|
||||
use crate::source::built_wheel_metadata::BuiltWheelMetadata;
|
||||
use crate::source::revision::Revision;
|
||||
use crate::Reporter;
|
||||
use crate::{Reporter, RequiresDist};
|
||||
|
||||
mod built_wheel_metadata;
|
||||
mod revision;
|
||||
|
|
@ -385,6 +385,14 @@ impl<'a, T: BuildContext> SourceDistributionBuilder<'a, T> {
|
|||
Ok(metadata)
|
||||
}
|
||||
|
||||
/// Return the [`RequiresDist`] from a `pyproject.toml`, if it can be statically extracted.
|
||||
pub(crate) async fn requires_dist(&self, project_root: &Path) -> Result<RequiresDist, Error> {
|
||||
let requires_dist = read_requires_dist(project_root).await?;
|
||||
let requires_dist =
|
||||
RequiresDist::from_workspace(requires_dist, project_root, self.preview_mode).await?;
|
||||
Ok(requires_dist)
|
||||
}
|
||||
|
||||
/// Build a source distribution from a remote URL.
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
async fn url<'data>(
|
||||
|
|
@ -1625,6 +1633,25 @@ async fn read_pyproject_toml(
|
|||
Ok(metadata)
|
||||
}
|
||||
|
||||
/// Return the [`pypi_types::RequiresDist`] from a `pyproject.toml`, if it can be statically extracted.
|
||||
async fn read_requires_dist(project_root: &Path) -> Result<pypi_types::RequiresDist, Error> {
|
||||
// Read the `pyproject.toml` file.
|
||||
let pyproject_toml = project_root.join("pyproject.toml");
|
||||
let content = match fs::read_to_string(pyproject_toml).await {
|
||||
Ok(content) => content,
|
||||
Err(err) if err.kind() == std::io::ErrorKind::NotFound => {
|
||||
return Err(Error::MissingPyprojectToml);
|
||||
}
|
||||
Err(err) => return Err(Error::CacheRead(err)),
|
||||
};
|
||||
|
||||
// Parse the metadata.
|
||||
let requires_dist = pypi_types::RequiresDist::parse_pyproject_toml(&content)
|
||||
.map_err(Error::DynamicPyprojectToml)?;
|
||||
|
||||
Ok(requires_dist)
|
||||
}
|
||||
|
||||
/// Read an existing cached [`Metadata23`], if it exists.
|
||||
async fn read_cached_metadata(cache_entry: &CacheEntry) -> Result<Option<Metadata23>, Error> {
|
||||
match fs::read(&cache_entry.path()).await {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue