見出し画像

PythonのRyeとuvを使った開発環境の構築

こんにちは、エンジニアのデータ配信チーム(和山、峯田、前田、國久)です。

データ配信チームでPythonの開発環境をRyeとuvで整えため、その方法を共有します。
Ryeは依存関係管理ツールで、uvはpipの機能をラップするツールです。これらを組み合わせることで、効率的な開発環境を構築することができます。

導入経緯

データ配信チームにおけるpythonの開発環境を統一できていなかったため、開発環境の差異が生まれ、その調整に時間を費やす問題がありました。また、既存の依存関係管理ツールは、依存関係の管理が煩雑で、新しいメンバーがプロジェクトに参加する際に時間がかかるという課題もありました。この問題を解決するために、統一された開発環境を構築し、依存関係の管理を簡素化する必要がありました。

概要説明

Ryeは、Pythonの依存関係を管理するためのツールです。これにより、プロジェクトごとに異なる依存関係を簡単に管理でき、環境の一貫性を保つことができます。uvはpipの機能をラップし、より高速な依存関係のインストールを可能にします。Ryeとuvを組み合わせることで、効率的な依存関係管理が可能になります。

導入方法

以下の手順でRyeとuvをインストールします。

1. Ryeのインストール

まず、Ryeをインストールします。

curl -sSf https://rye.astral.sh/get | bash

2. RyeのPATH解決

シェルが起動するたびに $HOME/.rye/env ファイルを読み込むように設定します。これにより、Ryeの環境設定が自動的に適用されます。

# zshの場合(Macのデフォルト)
echo 'source "$HOME/.rye/env"' >> ~/.zprofile

# bashの場合
echo 'source "$HOME/.rye/env"' >> ~/.profile

3. Ryeの設定変更

Ryeの設定を変更してuvを使用するようにします。Ryeインストール時にデフォルトでuvを利用するように設定した場合、すでに設定されています。

## ~/.rye/config.toml

[behavior]
global-python = true # <-ココ
use-uv = true

[default]
toolchain = "cpython@3.12"

もし、global-python = true が設定されていない場合は、以下のryeコマンドで設定してください。

rye config --set-bool behavior.use-uv=true

プロジェクトの初期化

1. 新しいプロジェクトを初期化

rye init

2. パッケージのインストールとアンインストール

パッケージのインストールとアンインストールは以下のコマンドで行います。 また、依存関係は pyproject.toml に追加されます。

rye add polars # install
rye remove polars # uninstall
# pyproject.toml
dependencies = ["polars>=1.3.0"]

3. 依存関係のコンパイル

cd service
uv pip compile pyproject.toml -o requirements.txt

ワークスペース機能の有効化

データ配信チームは、一つのリポジトリで複数の関数(AWS Lambda)を管理する必要があります。各Lambda毎に仮想環境が作成されると切り替えが大変なので、一つの仮想環境のみで管理したいです。 rye + uvで実現できるか調べたところ、ryeのワークスペース機能を使えば実現できそうだったので試してみました。

今回はプロジェクトルートの配下に services ディレクトリを作成し、その配下に個別のワークスペースを作る想定で進めます。

プロジェクトルートの設定

まずはプロジェクトルートの pyproject.toml ファイルに次の設定を追加します。

[tool.rye]
virtual = true
# 他の設定...

[tool.rye.workspace]
# ワークスペースを設定
members = ["services/*"]

個別のワークスペース作成

次に services ディレクトリに個別のワークスペース(service_aservice_b )を作成します。

mkdir services
cd services

# ワークスペース作成
# --py {Pythonバージョン} --virtualで仮想環境設定
rye init --py 3.12 --virtual service_a
rye init --py 3.12 --virtual service_b

# ワークスペースをプロジェクトルートに認識させる
rye sync

# サービスごとにライブラリを追加する
cd service_a
rye add polars

cd service_b
rye add pandas
rye add pydantic
# 削除するときはremove
rye remove pydantic

これで、各ワークスペースでパッケージ管理しつつ、仮想環境はプロジェクトルートの一つだけになりました!

requirements.txtの出力

最後に、requirements.txtを出力してみます。出力にはuvコマンドを使用します。

# requirements.txtを出力する
cd service_a
uv pip compile pyproject.toml -o requirements.txt

出力された requirements.txt は個別のワークスペースで設定したパッケージだけ出力されます。

# This file was autogenerated by uv via the following command:
#    uv pip compile pyproject.toml -o requirements.txt
polars==1.3.0
    # via service-a (pyproject.toml)

パッケージ全体はプロジェクトルートの requirements.lock ファイルでバージョン管理されています。

新規参入者は、プロジェクトルートで rye sync コマンドを実行するだけで全てのワークスペースのパッケージがダウンロードされ、すぐ開発することができます。

annotated-types==0.7.0
    # via pydantic
anyio==4.4.0
    # via starlette
numpy==2.0.1
    # via pandas
pandas==2.2.2
polars==1.3.0
# ...

まとめ

今回、RyeとuvによるPythonの開発環境を統一することによって、プロジェクトの依存関係を効率的に管理することができました。一貫性のある環境と簡単なセットアップによって、開発メンバーは環境設定に時間を費やさず、コードの作成に集中でき、開発生産性を向上することができます。今後も、より開発生産性が向上する取り組みをチームで続けていきます。


最後に、noteの更新情報やスペクティの最新情報は公式Xにて発信しています。ぜひフォローをお願いします!

次回もお楽しみに!