mirror of
https://github.com/astral-sh/uv.git
synced 2025-10-09 18:12:07 +00:00

Some checks are pending
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 / smoke test | linux aarch64 (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 / check system | alpine (push) Blocked by required conditions
CI / integration test | graalpy on windows (push) Blocked by required conditions
CI / integration test | uv publish (push) Blocked by required conditions
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 / mkdocs (push) Waiting to run
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 / smoke test | macos (push) Blocked by required conditions
CI / check windows trampoline | i686 (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 / check system | pyston (push) Blocked by required conditions
CI / build binary | linux libc (push) Blocked by required conditions
CI / build binary | linux aarch64 (push) Blocked by required conditions
CI / integration test | graalpy on ubuntu (push) Blocked by required conditions
CI / integration test | pyodide on ubuntu (push) Blocked by required conditions
CI / integration test | github actions (push) Blocked by required conditions
CI / integration test | free-threaded python on github actions (push) Blocked by required conditions
CI / smoke test | linux (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 windows (push) Blocked by required conditions
CI / integration test | aarch64 windows implicit (push) Blocked by required conditions
CI / integration test | aarch64 windows explicit (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 / 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 | graalpy on ubuntu (push) Blocked by required conditions
CI / check system | pypy on ubuntu (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 | python on macos x86-64 (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 | aarch64 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 | conda3.8 on linux x86-64 (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 / integration test | determine publish changes (push) Blocked by required conditions
CI / integration test | registries (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 | 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.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 | walltime aarch64 linux (push) Blocked by required conditions
CI / benchmarks | instrumented (push) Blocked by required conditions
## Summary I think doing this would almost always be a mistake, since it won't install any transitive dependencies. Instead, I took the opportunity to mention the `pylock.toml` format. Closes https://github.com/astral-sh/uv/issues/14507#issuecomment-3050083116.
218 lines
7.3 KiB
Markdown
218 lines
7.3 KiB
Markdown
# Locking environments
|
|
|
|
Locking is to take a dependency, e.g., `ruff`, and write an exact version to use to a file. When
|
|
working with many dependencies, it is useful to lock the exact versions so the environment can be
|
|
reproduced. Without locking, the versions of dependencies could change over time, when using a
|
|
different tool, or across platforms.
|
|
|
|
## Locking requirements
|
|
|
|
uv allows dependencies to be locked in the `requirements.txt` format. It is recommended to use the
|
|
standard `pyproject.toml` to define dependencies, but other dependency formats are supported as
|
|
well. See the documentation on [declaring dependencies](dependencies.md) for more details on how to
|
|
define dependencies.
|
|
|
|
To lock dependencies declared in a `pyproject.toml`:
|
|
|
|
```console
|
|
$ uv pip compile pyproject.toml -o requirements.txt
|
|
```
|
|
|
|
Note by default the `uv pip compile` output is just displayed and `--output-file` / `-o` argument is
|
|
needed to write to a file.
|
|
|
|
To lock dependencies declared in a `requirements.in`:
|
|
|
|
```console
|
|
$ uv pip compile requirements.in -o requirements.txt
|
|
```
|
|
|
|
To lock dependencies declared in multiple files:
|
|
|
|
```console
|
|
$ uv pip compile pyproject.toml requirements-dev.in -o requirements-dev.txt
|
|
```
|
|
|
|
uv also supports legacy `setup.py` and `setup.cfg` formats. To lock dependencies declared in a
|
|
`setup.py`:
|
|
|
|
```console
|
|
$ uv pip compile setup.py -o requirements.txt
|
|
```
|
|
|
|
To lock dependencies from stdin, use `-`:
|
|
|
|
```console
|
|
$ echo "ruff" | uv pip compile -
|
|
```
|
|
|
|
To lock with optional dependencies enabled, e.g., the "foo" extra:
|
|
|
|
```console
|
|
$ uv pip compile pyproject.toml --extra foo
|
|
```
|
|
|
|
To lock with all optional dependencies enabled:
|
|
|
|
```console
|
|
$ uv pip compile pyproject.toml --all-extras
|
|
```
|
|
|
|
Note extras are not supported with the `requirements.in` format.
|
|
|
|
To lock a dependency group in the current project directory's `pyproject.toml`, for example the
|
|
group `foo`:
|
|
|
|
```console
|
|
$ uv pip compile --group foo
|
|
```
|
|
|
|
!!! important
|
|
|
|
A `--group` flag has to be added to pip-tools' `pip compile`, [although they're considering it](https://github.com/jazzband/pip-tools/issues/2062). We expect to support whatever syntax and semantics they adopt.
|
|
|
|
To specify the project directory where groups should be sourced from:
|
|
|
|
```console
|
|
$ uv pip compile --project some/path/ --group foo --group bar
|
|
```
|
|
|
|
Alternatively, you can specify a path to a `pyproject.toml` for each group:
|
|
|
|
```console
|
|
$ uv pip compile --group some/path/pyproject.toml:foo --group other/pyproject.toml:bar
|
|
```
|
|
|
|
!!! note
|
|
|
|
`--group` flags do not apply to other specified sources. For instance,
|
|
`uv pip compile some/path/pyproject.toml --group foo` sources `foo`
|
|
from `./pyproject.toml` and **not** `some/path/pyproject.toml`.
|
|
|
|
## Upgrading requirements
|
|
|
|
When using an output file, uv will consider the versions pinned in an existing output file. If a
|
|
dependency is pinned it will not be upgraded on a subsequent compile run. For example:
|
|
|
|
```console
|
|
$ echo "ruff==0.3.0" > requirements.txt
|
|
$ echo "ruff" | uv pip compile - -o requirements.txt
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv pip compile - -o requirements.txt
|
|
ruff==0.3.0
|
|
```
|
|
|
|
To upgrade a dependency, use the `--upgrade-package` flag:
|
|
|
|
```console
|
|
$ uv pip compile - -o requirements.txt --upgrade-package ruff
|
|
```
|
|
|
|
To upgrade all dependencies, there is an `--upgrade` flag.
|
|
|
|
## Syncing an environment
|
|
|
|
Dependencies can be installed directly from their definition files or from compiled
|
|
`requirements.txt` files with `uv pip install`. See the documentation on
|
|
[installing packages from files](packages.md#installing-packages-from-files) for more details.
|
|
|
|
When installing with `uv pip install`, packages that are already installed will not be removed
|
|
unless they conflict with the lockfile. This means that the environment can have dependencies that
|
|
aren't declared in the lockfile, which isn't great for reproducibility. To ensure the environment
|
|
exactly matches the lockfile, use `uv pip sync` instead.
|
|
|
|
To sync an environment with a `requirements.txt` file:
|
|
|
|
```console
|
|
$ uv pip sync requirements.txt
|
|
```
|
|
|
|
To sync an environment with a [PEP 751](https://peps.python.org/pep-0751/) `pylock.toml` file:
|
|
|
|
```console
|
|
$ uv pip sync pylock.toml
|
|
```
|
|
|
|
## Adding constraints
|
|
|
|
Constraints files are `requirements.txt`-like files that only control the _version_ of a requirement
|
|
that's installed. However, including a package in a constraints file will _not_ trigger the
|
|
installation of that package. Constraints can be used to add bounds to dependencies that are not
|
|
dependencies of the current project.
|
|
|
|
To define a constraint, define a bound for a package:
|
|
|
|
```python title="constraints.txt"
|
|
pydantic<2.0
|
|
```
|
|
|
|
To use a constraints file:
|
|
|
|
```console
|
|
$ uv pip compile requirements.in --constraint constraints.txt
|
|
```
|
|
|
|
Note that multiple constraints can be defined in each file and multiple files can be used.
|
|
|
|
uv will also read `constraint-dependencies` from the `pyproject.toml` at the workspace root, and
|
|
append them to those specified in the constraints file.
|
|
|
|
## Adding build constraints
|
|
|
|
Similar to `constraints`, but specifically for build-time dependencies, including those required
|
|
when building runtime dependencies.
|
|
|
|
Build constraint files are `requirements.txt`-like files that only control the _version_ of a
|
|
build-time requirement. However, including a package in a build constraints file will _not_ trigger
|
|
its installation at build time; instead, constraints apply only when the package is required as a
|
|
direct or transitive build-time dependency. Build constraints can be used to add bounds to
|
|
dependencies that are not explicitly declared as build-time dependencies of the current project.
|
|
|
|
For example, if a package defines its build dependencies as follows:
|
|
|
|
```toml title="pyproject.toml"
|
|
[build-system]
|
|
requires = ["setuptools"]
|
|
build-backend = "setuptools.build_meta"
|
|
```
|
|
|
|
Build constraints could be used to ensure that a specific version of `setuptools` is used for every
|
|
package in the workspace:
|
|
|
|
```python title="build-constraints.txt"
|
|
setuptools==75.0.0
|
|
```
|
|
|
|
uv will also read `build-constraint-dependencies` from the `pyproject.toml` at the workspace root,
|
|
and append them to those specified in the build constraints file.
|
|
|
|
## Overriding dependency versions
|
|
|
|
Overrides files are `requirements.txt`-like files that force a specific version of a requirement to
|
|
be installed, regardless of the requirements declared by any constituent package, and regardless of
|
|
whether this would be considered an invalid resolution.
|
|
|
|
While constraints are _additive_, in that they're combined with the requirements of the constituent
|
|
packages, overrides are _absolute_, in that they completely replace the requirements of the
|
|
constituent packages.
|
|
|
|
Overrides are most often used to remove upper bounds from a transitive dependency. For example, if
|
|
`a` requires `c>=1.0,<2.0` and `b` requires `c>=2.0` and the current project requires `a` and `b`
|
|
then the dependencies cannot be resolved.
|
|
|
|
To define an override, define the new requirement for the problematic package:
|
|
|
|
```python title="overrides.txt"
|
|
c>=2.0
|
|
```
|
|
|
|
To use an overrides file:
|
|
|
|
```console
|
|
$ uv pip compile requirements.in --override overrides.txt
|
|
```
|
|
|
|
Now, resolution can succeed. However, note that if `a` is _correct_ that it does not support
|
|
`c>=2.0` then a runtime error will likely be encountered when using the packages.
|
|
|
|
Note that multiple overrides can be defined in each file and multiple files can be used.
|