uv
uv copied to clipboard
`uv sync` does not install a workspace member's dependency with extra
Context
Consider the following project structure where:
- The root project is the workspace root with two members:
a-lib
andan-app
- The root project has
a-lib
as a dependency - The
a-lib
library has an optional dependencynetwork = ["httpx>=0.27.2"]
- The
an-app
application has a dependency"a-lib[network]"
.
├── README.md
├── a-lib
│ ├── README.md
│ ├── pyproject.toml
│ └── src
│ └── a_lib
│ └── __init__.py
├── an-app
│ ├── app.py
│ └── pyproject.toml
├── hello.py
├── pyproject.toml
└── uv.lock
Expected behavior
-
uv sync
should installhttpx
as:-
httpx
is in thenetwork
extra ofa-lib
-
a-lib[network]
is a dependency ofan-app
, which is a workspace member
-
Actual behavior
- Running
uv sync
in the repository root does not installhttpx
.
Output of uv sync -v
:
DEBUG uv 0.4.0
DEBUG Found project root: `/Users/nomura/tmp/uv-opt-dep`
DEBUG Found workspace root: `/Users/nomura/tmp/uv-opt-dep`
DEBUG Adding current workspace member: `/Users/nomura/tmp/uv-opt-dep`
DEBUG Adding discovered workspace member: `/Users/nomura/tmp/uv-opt-dep/a-lib`
DEBUG Adding discovered workspace member: `/Users/nomura/tmp/uv-opt-dep/an-app`
DEBUG Searching for Python >=3.12 in managed installations or system path
DEBUG Searching for managed installations at `/Users/nomura/Library/Application Support/uv/python`
DEBUG Found managed installation `cpython-3.12.5-macos-aarch64-none`
DEBUG Found `cpython-3.12.5-macos-aarch64-none` at `/Users/nomura/Library/Application Support/uv/python/cpython-3.12.5-macos-aarch64-none/bin/python3` (managed installations)
Using Python 3.12.5
Creating virtualenv at: .venv
DEBUG Using request timeout of 30s
DEBUG Acquired lock for `/Users/nomura/Library/Caches/uv/built-wheels-v3/editable/927367c801095033`
DEBUG Found static `pyproject.toml` for: a-lib @ file:///Users/nomura/tmp/uv-opt-dep/a-lib
DEBUG Found workspace root: `/Users/nomura/tmp/uv-opt-dep`
DEBUG Adding root workspace member: `/Users/nomura/tmp/uv-opt-dep`
DEBUG Adding current workspace member: `/Users/nomura/tmp/uv-opt-dep/a-lib`
DEBUG Adding discovered workspace member: `/Users/nomura/tmp/uv-opt-dep/an-app`
DEBUG Acquired lock for `/Users/nomura/Library/Caches/uv/built-wheels-v3/path/380ad038dfb54863`
DEBUG Found static `pyproject.toml` for: an-app @ file:///Users/nomura/tmp/uv-opt-dep/an-app
DEBUG Found workspace root: `/Users/nomura/tmp/uv-opt-dep`
DEBUG Adding root workspace member: `/Users/nomura/tmp/uv-opt-dep`
DEBUG Adding current workspace member: `/Users/nomura/tmp/uv-opt-dep/an-app`
DEBUG Adding discovered workspace member: `/Users/nomura/tmp/uv-opt-dep/a-lib`
DEBUG Acquired lock for `/Users/nomura/Library/Caches/uv/built-wheels-v3/path/f80ace0e74a88082`
DEBUG Found static `pyproject.toml` for: uv-opt-dep @ file:///Users/nomura/tmp/uv-opt-dep
DEBUG Found workspace root: `/Users/nomura/tmp/uv-opt-dep/`
DEBUG Adding current workspace member: `/Users/nomura/tmp/uv-opt-dep/`
DEBUG Adding discovered workspace member: `/Users/nomura/tmp/uv-opt-dep/a-lib`
DEBUG Adding discovered workspace member: `/Users/nomura/tmp/uv-opt-dep/an-app`
DEBUG Acquired lock for `/Users/nomura/Library/Caches/uv/built-wheels-v3/editable/927367c801095033`
DEBUG Found static `pyproject.toml` for: a-lib @ file:///Users/nomura/tmp/uv-opt-dep/a-lib
DEBUG Found workspace root: `/Users/nomura/tmp/uv-opt-dep`
DEBUG Adding root workspace member: `/Users/nomura/tmp/uv-opt-dep`
DEBUG Adding current workspace member: `/Users/nomura/tmp/uv-opt-dep/a-lib`
DEBUG Adding discovered workspace member: `/Users/nomura/tmp/uv-opt-dep/an-app`
DEBUG Existing `uv.lock` satisfies workspace requirements
Resolved 10 packages in 1ms
DEBUG Using request timeout of 30s
DEBUG Directory source requirement already cached: a-lib==0.1.0 (from file:///Users/nomura/tmp/uv-opt-dep/a-lib)
Installed 1 package in 0.78ms
+ a-lib==0.1.0 (from file:///Users/nomura/tmp/uv-opt-dep/a-lib)
- If you remove the
project.optional-dependencies
section froma-lib/pyproject.toml
and runuv add httpx --optional network
, it will installhttpx
as expected. However, runninguv sync
will removehttpx
again.
For reproduction
For reproduction, please follow the instruction on this repository: https://github.com/shunichironomura/uv-opt-dep
Environment
- uv platform: macOS
- uv version:
uv 0.4.0 (d9bd3bc7a 2024-08-28)