mirror of
https://github.com/astral-sh/uv.git
synced 2025-11-01 20:31:12 +00:00
This PR principally adds a routine for converting a `Lock` to a `Resolution`, where a `Resolution` is a map of package names pinned to a specific version. I'm not sure that a `Resolution` is ultimately what we want here (we might need more stuff), but this was the quickest route I could find to plug a `Lock` into our existing `uv pip install` infrastructure. This commit also does a little refactoring of the `Lock` types. The main thing is to permit extra state on some of the types (like a `by_id` map on `Lock` for quick lookups of distributions) that aren't included in the serialization format of a `Lock`. We achieve this by defining separate `Wire` types that are automatically converted to-and-from via `serde`. Note that like with the lock file format types themselves, we leave a few `todo!()` expressions around. The main idea is to get something minimally working without spending too much effort here. (A fair bit of refactoring will be required to generate a lock file, and it's not clear how much this code will wind up needing to change anyway.) In particular, we only handle the case of installing wheels from a registry. A demonstration of the full flow: ``` $ requirements.in anyio $ cargo run -p uv -- pip compile -p3.10 requirements.in --unstable-uv-lock-file $ uv venv $ cargo run -p uv -- pip install --unstable-uv-lock-file anyio -r requirements.in Installed 5 packages in 7ms + anyio==4.3.0 + exceptiongroup==1.2.1 + idna==3.7 + sniffio==1.3.1 + typing-extensions==4.11.0 ``` In order to install from a lock file, we start from the root and do a breadth first traversal over its dependencies. We aren't yet filtering on marker expressions (since they aren't in the lock file yet), but we should be able to add that in the future. In so doing, the traversal should select only the subset of distributions relevant for the current platform. |
||
|---|---|---|
| .. | ||
| src | ||
| tests | ||
| Cargo.toml | ||