Open1

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

colum2131colum2131

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の依存関係のみでの実行が可能になります。
Apyproject.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.tomlAをソースに加えます。

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!

無事実行できました。

この状態でもABの依存を追加することができます。

他のワークスペースの詳細は公式ドキュメントを参照してください。また、依存パッケージのバージョンを異なるものに設定したい場合はConflicting dependencies - Configuring projectsを参照してください。