お雑煮研究会

好きな焼肉は魚

Pythonのプロジェクト管理ツールをryeからuvへ移行する

ryeとuvとはなにか

rye: Python のプロジェクトとパッケージ管理を包括的に行うことを目的に開発されているツール。 Python のバージョン管理・venv 管理・依存関係管理を一括で行えるのが特徴であり、タスクランナーなども付属している。

rye.astral.sh

uv: pip と pip-compile を置き換えることを目標にしたツール。要するに依存関係が爆速なpipくらいの認識で良い。 Rust における cargo の立ち位置を目標に開発されており、rye は途中から内部的に uv を利用するようになった。

docs.astral.sh

最近では uv が rye 同等のプロジェクト管理機能を持つようになり、2024.10.12 時点ではタスクランナー以外の rye でできることは uv でもできると言っていい状態だ。

将来的には uv が rye を吸収するとみられる。

github.com

ちなみに、uv を開発している astral-sh は Python用 Linter / Formatter として格を上げてきている ruff の開発元でもある。

移行のモチベーション

先ほど書いた通り、 rye と uv はプロジェクト管理ツールとしてほぼ同等の力を持っているので、すぐに移行する必要性はない。 それでも今 rye から uv へ移行することを決めたのには、renovateサポートが関係している。

docs.astral.sh

uv のパッケージ解決は

  1. pyproject.toml の project.dependencies / tool.uv.dev-dependencies を見る
  2. それをもとに依存関係を解決
  3. 独自形式の uv.lock を生成する

のステップで行われるが、 renovateは pyproject.toml と uv.lock 両方のファイルに対する依存関係の自動更新に対応している。

要するに pnpm を使っているプロジェクトの依存関係を renovate で管理しているのと同等の体験が得られる。

今まで Python プロジェクトの依存関係自動更新はかなり面倒だったので、rye の体験に renovate の体験が加わるなら大変良いと思って移行を決めた。

移行方法

有志の方が rye-uv というツールを提供しているので、 migration はほぼこれだけで完了する。

github.com

rye のタスクランナーを使用していた場合は、uv にその機能がないため Warning が出る。 これは、 Makefile なり Taskfile なり poethepoet なりで対処できるのでよしなにする。

Renovate による管理を有効化する際は、 renovate.json"enabledManagers": ["pep621"] を追加すればよい。

おわり

おわり

おまけ: rye から uv へ移行した際のPR