はじめに
インティメート・マージャー開発本部の岡田です。
Pythonパッケージマネージャーはいくつか種類がありますが、その中でもuvはやはりその早さが非常に魅力的です。
ただ、今使っているパッケージマネージャーから乗り換えるためにあれこれ調べるの、大変ですよね......
今poetryで管理しているリポジトリをuvでの管理に移行したいけど、何を変えればいいのか分からない...修正が面倒...そう思って中々移行が進まないそんなあなたに、uv移行の手順をご紹介します!
想定環境
- poetryでpythonパッケージを管理
- dockerを使用している
事前準備
uvをインストールしましょう!
curl -LsSf https://astral.sh/uv/install.sh | sh
上のコマンドを打てばOKです。pipやbrewなどを使ってインストールすることもできます。その場合は、
brew install uv
などでインストールできます。
設定の書き換え
poetryの設定ファイルといえばpyproject.tomlですが、uvでも同じファイルを使ってパッケージ管理の設定を書くことができます。
ここの設定ですが、なんと以下のコマンドを打つことでuv向けの設定に書き換えることができます。
uvx migrate-to-uv
こちらのコマンドで基本的に設定ファイルの書き換えはうまくいくのですが......poetryとuvでは準拠しているPEPに差分があり、例えばPEP 517/518準拠で設定ファイルを書いている場合は一部の設定はコマンドだけではうまく書き換えをできないことがあります。その場合手動での書き換えが必要になるので対応を紹介します。
- バージョン指定
- ^を用いたバージョン指定をしている場合、~や>,<を用いた書き方に修正する
- [build-system]
- 自動で設定されるが、プロジェクトのファイル構造によってはbuildがうまくいかない場合もあるので、問題が起きたら書き直すor消す
lockfileの作成
uvでは、uv.lockというlockfileを用います。こちらは、以下のコマンドで生成可能です。
uv lock
Docker周りの修正
次はDockerfileの修正です。まずpipやpoetry関連の変数を削除して、uvの設定を追加しましょう。
# 設定例
ENV UV_PROJECT_ENVIRONMENT=/usr/local \
UV_COMPILE_BYTECODE=1 \
UV_LINK_MODE=copy
次に、poetry自体のインストールと、pythonパッケージインストール周りのコマンドを削除して、uv自体のインストールとpythonパッケージインストールのコマンドを追加しましょう
COPY --from=ghcr.io/astral-sh/uv:latest /uv /bin/
RUN --mount=type=cache,target=${UV_CACHE_DIR} \
--mount=type=bind,source=uv.lock,target=uv.lock \
--mount=type=bind,source=pyproject.toml,target=pyproject.toml \
uv sync --frozen --no-editable --no-dev
docker-composeを使用している場合、忘れずにdocker-compose.yamlのマウントをpoetry.lockからuv.lockに変更しておきましょう
おわりに
uv移行の方法の紹介でした。
uvへの移行はmigrate-to-uvツールが強力で、このツールがあることによって手動で書き換える手間はそんなに多くないです。皆さんもどんどんuvを使っていきましょう!
明日は、この話を踏まえて自作PythonパッケージをGAR(GoogleCloudArtifactRegisty)で管理し、uvでのパッケージ管理に乗せる話をします。明日の記事もよろしくお願いします。
他のインティメート・マージャーのアドベントカレンダーの記事もぜひどうぞ!
また、インティメート・マージャーでは、新卒から中途採用まで幅広く採用募集中です!
記事を読んで弊社に興味を持ってくれた方は、下記より採用情報をチェックしてみて下さい!