mirror of
				https://github.com/astral-sh/uv.git
				synced 2025-10-31 20:09:09 +00:00 
			
		
		
		
	 5e2dc5a9aa
			
		
	
	
		5e2dc5a9aa
		
			
		
	
	
	
		
			
	
		
	
	
		
			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.
 |