メインコンテンツへスキップ

uvでサードパーティ製ライブラリを管理する

·2704 文字·6 分
目次
uv - この記事は連載の一部です
パート 2: この記事

はじめに
#

Pythonのパッケージ管理ツールuvの使用方法を解説するシリーズの第2段です。 uvでサードパーティ製ライブラリの追加・削除、およびバージョンを管理する方法を解説します。

検証環境は以下の通りです。

  • Windows 10 Home 22H2
  • uv 0.8.14

この記事では、uvの以下のコマンドについて解説します。

  • uv add [PACKAGES]: パッケージ(ライブラリ)を仮想環境にインストールする。
    • uv add --dev [PACKAGES]: 開発用のグループdevにインストールする。
    • uv add --group <GROUP> [PACKAGES]: 任意のグループにインストールする。
    • uv add --optional <OPTIONAL> [PACKAGES]: オプションの依存関係としてインストールする。
  • uv remove [PACKAGES]: ライブラリを仮想環境からアンインストールする。
  • uv tree: ライブラリの依存関係を木構造で可視化する。

ライブラリ管理の基礎
#

始めにuvによるライブラリ管理の仕組みについて解説します。

インストール
#

uvの仮想環境にライブラリをインストールする場合、uv addコマンドを実行します。

uv add [PACKAGES]

複数のライブラリを指定したり、バージョンを指定することも可能です。

uv add flask pandas
uv add flask==3.1.2

なお、uv addコマンドにオプションを付けることによって、実行用ライブラリと開発用ライブラリを分けて管理することなどが可能です。 オプションの詳細については後述します。

アンインストール
#

仮想環境からライブラリをアンインストールする場合、uv removeコマンドを実行します。

uv remove [PACKAGES]

インストール時にオプションを付けた場合、uv removeコマンドにもオプションが必要な場合があります。

uv add --dev ruff
uv remove --dev ruff

ライブラリ管理のファイル
#

uvでは以下2つのファイルでライブラリを管理します。

  • pyproject.toml
  • uv.lock

各ファイルの違いを以下に記します。

pyproject.toml
#

pyproject.tomlでは、ユーザが作成するスクリプトが直接依存するライブラリのバージョンを管理します。 主にuvによって管理されますが、人の手で修正することも可能です。 ruff==0.12.11のようにバージョンを一意に指定することや、ruff>=0.12.11のように範囲指定することも可能です。

uv.lock
#

uv.lockは全ライブラリのバージョンを正確に記載するファイルです。 uvによって機械的に管理され、人の手で修正することは想定していません。 uv.lockがあることで、異なる仮想環境でも同じライブラリのバージョンをインストールできることが保障されます。 また、uv.lockはTOML形式となっています。

ライブラリの管理フィールド
#

uvではサードパーティ製ライブラリをグループでまとめたり、実行に必要なライブラリと開発に必要なライブラリで分けて管理することができます。 これらの区分は、pyproject.tomlで以下のように異なるフィールドで示されます。

# pyproject.toml
[project]
# 実行に必要なライブラリ
dependencies = [
  "httpx>=0.27.2",
]

[dependency-groups]
# グループとして管理するライブラリ
dev = [
  "pytest>=8.1.1, <9",
]

[project.optional-dependencies]
# オプションのライブラリ
plot = [
  "matplotlib>=3.6.3",
]

project.dependencies
#

project.dependenciesは最も基本となるライブラリのフィールドです。 以下のコマンドでライブラリをインストールすると、このフィールドに追加されます。

uv add [PACKAGES]

dependency-groups
#

dependency-groupsには、開発用ライブラリなどをグループにまとめて定義します。 dependency-groupsPEP 735で公式に定義された仕様です。 グループ名にはdevplotなど、任意の名前を定義できます。

# pyproject.toml
[dependency-groups]
# グループとして管理するライブラリ
dev = [
  "pytest>=8.1.1, <9",
]
doc = [
  "mkdocs>=1.6.1",
  "mkdocs-material>=9.6.18",
]

一般に、devには開発用ライブラリを定義します。 開発用ライブラリとは、開発者のみ使用するリンターや自動テスト用のライブラリ (ruff, pytest, mypyなど) のことです。 なお、devグループはuvにおいてオプションが用意されているなど、特別な意味を持ちます。

devグループにライブラリを追加する場合、--devオプションを付けます。

uv add --dev [PACKAGES]

dev以外のグループにライブラリを追加する場合、--group <GROUP>オプションを付けます。

uv add --group <GROUP> [PACKAGES]
# 例
# uv add --group doc mkdocs

project.optional-dependencies
#

project.optional-dependenciesのフィールドには、実行に必要ではあるが、デフォルトではユーザにインストールさせないライブラリを定義します。 デフォルトでインストールさせない理由としては、そのライブラリに依存する機能をごく一部のユーザしか利用しない、などが考えられます(例:Pandasにおけるopenpyxlライブラリ)。

project.optional-dependenciesにライブラリを追加する場合、--optional <OPTIONAL>オプションを付けます。

uv add --optional <OPTIONAL> [PACKAGES]
# 例:
# uv add --optional plot matplotlib

なお、project.optional-dependenciesに定義されたライブラリはextraと呼ばれます。

コマンドとフィールドの対比
#

インストール用コマンドuv addのオプションと、pyproject.tomlのフィールドの対比は以下のテーブルのようになります。

コマンド インストール先のフィールド
uv add project.dependencies
uv add --dev dependency-groups.dev
uv add --group <GROUP> dependency-groups.GROUP
uv add --optional <OPTIONAL> project.optional-dependencies.OPTIONAL

また、各フィールドに定義されたライブラリは、uv syncで環境を構築するときのインストールの有無も異なります。 以下のテーブルに、uv syncの主なオプションとフィールドの関係を示します(〇はインストールされます)。

コマンド project.dependencies dependency-groups.dev project.optional-dependencies
オプション無 ×
--no-dev × ×
--only-dev × ×
--all-extras

他にもインストールを制御するオプションは多数あります。 group系のオプションはdependency-groupsのフィールドに、extra系のオプションはproject.optional-dependenciesのフィールドに関係しています。

ライブラリ依存関係の可視化
#

インストールしたライブラリを表示するには、uv treeコマンドを実行します。

> uv tree
Resolved 8 packages in 2ms
myapp v0.1.0
├── pytest v8.4.2
│   ├── colorama v0.4.6
│   ├── iniconfig v2.1.0
│   ├── packaging v25.0
│   ├── pluggy v1.6.0
│   └── pygments v2.19.2
└── ruff v0.13.1

ここで、第1階層のmyappは自分で作成したプロジェクトです。 その下のpytest, ruffuv addで明示的にインストールしたライブラリになります。 これより下の階層は、付随してインストールしたライブラリです。

まとめ
#

  • uv add [PACKAGES]: パッケージ(ライブラリ)を仮想環境にインストールする。
    • uv add --dev [PACKAGES]: 開発用のグループdevにインストールする。
    • uv add --group <GROUP> [PACKAGES]: 任意のグループにインストールする。
    • uv add --optional <OPTIONAL> [PACKAGES]: オプションの依存関係としてインストールする。
  • uv remove [PACKAGES]: ライブラリを仮想環境からアンインストールする。
  • uv tree: ライブラリの依存関係を木構造で可視化する。

参考
#

Helve
著者
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です
uv - この記事は連載の一部です
パート 2: この記事

関連記事

uvでPythonプロジェクトを始める
·2896 文字·6 分
Pythonのパッケージ管理ツールuvでプロジェクトを新しく開始する方法を解説します。
PythonでタスクランナーTaskfileを使う
·2655 文字·6 分
タスクランナーTaskfileをPython環境にインストールし、Ruff, mypy, pytestを実行する方法をまとめました。
Pythonの列挙型Enumを検証
·1462 文字·3 分
Pythonの列挙型Enumについて、同値判定の方法、型ヒントやdocstringの書き方などを調査した結果を備忘録として残します。
Sphinxでサイトマップを作る
·812 文字·2 分
Sphinxでサイト構造を示すサイトマップ (sitemap.xml) を作成する方法をまとめました。
Sphinxで生成するHTMLにSNSシェア用のOGPタグを設定する
·1359 文字·3 分
Sphinxで生成する記事のHTMLに、SNSで詳細情報を伝えるためのOGP (Open Graph Protocol) を導入する方法をまとめました。
SphinxでMarkdown拡張言語のMySTを扱う
·1768 文字·4 分
SphinxでMarkdownの拡張言語であるMyST (Markedly Structured Text) を導入する方法をまとめました。