Open1
uvのWorkspace機能でメンバー間で依存関係に指定する

uvでプロジェクトを初期化します。
uv init project
cd project
uvでプロジェクト内でuv init --package A
を実行すると、以下のようにAという新しいパッケージ(ワークスペースメンバー)が初期化されます。
uv init --package A
project/
├── A
│ ├── README.md
│ ├── pyproject.toml
│ └── src
│ └── a
│ └── __init__.py
├── README.md
├── main.py
└── pyproject.toml
また、このproject自体のpyproject.toml
にはtool.uv.workspace.members
という属性が追加されます。
pyproject.toml
[project]
name = "project"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.10"
dependencies = []
[tool.uv.workspace]
members = [
"A",
]
このワークスペースはuv run --package A
とすると、A
の依存関係のみでの実行が可能になります。
A
のpyproject.toml
にはproject.scripts
が設定されており、以下のように実行することができます。
uv run --package A a
Using CPython 3.10.15
Creating virtual environment at: .venv
Built a @ file:///workspace/project/A
Installed 1 package in 1ms
Hello from a!
同様にA
のみに依存を追加することができます。
uv add --package A numpy
ワークスペースメンバーをパッケージとみなしてインストールすることができます。以下のように[tool.uv.sources]
とdependencies
を編集してください。
pyproject.toml
[project]
name = "project"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
"A",
]
[tool.uv.sources]
A = { workspace = true }
[tool.uv.workspace]
members = [
"A",
]
uv sync
するとa
というパッケージと先ほど追加したnumpy
がインストールされることが確認できます。
uv sync
Resolved 3 packages in 2ms
Installed 2 packages in 17ms
+ a==0.1.0 (from file:///workspace/project/A)
+ numpy==2.2.5
ここからが本題ですが、このワークスペースメンバー間で依存関係を追加することができます。
新しくB
というメンバーを作成しましょう。
uv init --package B
project/
├── A
│ ├── README.md
│ ├── pyproject.toml
│ └── src
│ └── a
│ └── __init__.py
├── B
│ ├── README.md
│ ├── pyproject.toml
│ └── src
│ └── b
│ └── __init__.py
├── README.md
├── main.py
├── pyproject.toml
└── uv.lock
ここでB/pyproject.toml
にA
をソースに加えます。
B/pyproject.toml
[project]
name = "b"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
"A"
]
[tool.uv.sources]
B = { workspace = true }
[project.scripts]
b = "b:main"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
これでB
でaを実行しましょう。
uv run --package B a
Hello from a!
無事実行できました。
この状態でもA
にB
の依存を追加することができます。
他のワークスペースの詳細は公式ドキュメントを参照してください。また、依存パッケージのバージョンを異なるものに設定したい場合はConflicting dependencies - Configuring projectsを参照してください。