Pythonパッケージ管理ツール ryeの使い勝手がよかったので使用方法をまとめました。
ryeとは
GitHub: https://github.com/mitsuhiko/rye
flaskの作者である Armin Ronacher氏 (GitHubアカウント @mitsuhiko)が個人利用目的で作成した、Pythonのパッケージ関係管理ツールです。内部実装はRustです。
ryeが作成された思想がリポジトリ Should Rye Exist? のDiscussionページに書かれています。
Disucssion中の図にあるように、従来のPythonのパッケージ管理は”様々な標準”が存在し、このばらつきを統一しようと新しくパッケージ管理ツールを導入しても、”新たな標準が追加されるだけ”となり、真のパッケージ管理の標準化を行えていないと指摘しています。
そのためArmin Ronacher氏は this is why I never wanted to publish rye
とコメントし、公開を躊躇っていたようです。
同氏はRustのcargoのように、Pythonのプロジェクト管理を行うデフォルト機能が備わることを望んでいて、その1つの形がryeと指摘しています。
公式ドキュメントでは ryeを one-stop-shop ツールと表現しています。この意図として、面倒なPythonのインストールや、依存関係の解決をryeが行ってくれるため、開発者はryeのみを認識しておけばよいと指摘してます。
イメージとしては pyenv+poetryのように、Pythonインタプリタの管理と、パッケージの管理を別々で行なっていた操作を、オールインワンで全て行ってくれるものです。
作者のArmin Ronacher氏はチュートリアルの動画中でも個人利用の目的のツールであることを強調しています。
今後のメンテナンスが行われるか不明と述べているため、チームでの利用を検討する際は注意してください。
インストール
公式ドキュメントページ: https://rye-up.com/guide/installation/
Mac, Linuxユーザーは以下のコマンドでバイナリをダウンロードし、インストールを行えます。
curl -sSf https://rye-up.com/get | bash
ryeのPATHを通します。以下はシェルにbashを使ってる場合の例です。
echo 'source "$HOME/.rye/env"' >> ~/.bashrc
ryeの使用方法
基本的な流れはpoetryと似ています。
- プロジェクトの作成
- pythonバージョンの指定
- 依存関係の管理
- 仮想環境での実行
1. プロジェクトの作成
ryeではPEP-518で定義された標準フォーマットである、pyproject.toml
を使用して、Pythonの依存関係を管理します。
ryeを使用する場合、pyproject.tomlの作成から始まります。
pyproject.tomlの作成方法は2パターンあります。
- 新たにプロジェクトを作成
- 既存のプロジェクトに追加
新たにプロジェクトを作成
$ rye init my-project
で新しくディレクトリを作成し、プロジェクトを作成できます。
以下のフォルダとファイルが自動的に作成されます。
my-project ├── .python-version ├── README.md ├── pyproject.toml └── src └── my_project └── __init__.py
- .python-version : プロジェクトで使用するpythonバージョン
- README.md : プロジェクトのドキュメント
pyproject.toml : プロジェクト・rye自体の設定に関するメタデータを管理するファイル。ryeのほとんどのコマンドはこのファイルに記述します。
注意: ryeではsetup.pyがサポートされていません。pyproject.tomlによる管理に統一されています。
src: プロジェクトのコードディレクトリ
既存のプロジェクトに追加
既に存在するpython プロジェクト my-project
を rye で管理する場合
$ cd my-project $ rye init
でpyproject.tomlを作成できます。
2. pythonバージョンの指定
プロジェクトで使用するPythonバージョン指定は以下のコマンドで行えます。
$ rye pin 3.10
poetryを使用する場合、開発者が必要なバージョンの環境をpyenvなどで別途用意する必要がありますが、ryeでは裏側でvirtualenvを立ち上げて指定したバージョンのPython環境を用意してくれます。
Pythonバージョンの指定を行なった後、ryeの用意するpython環境と、現在の設定を同期させます。
$ rye sync
を実行すると、 .venv
にryeが管理するvirtualenvのファイル作成されます。
依存関係を記述した2つのlockfileが自動作成されます。
- requirements.lock
- requirements-dev.lock
3. 依存関係の管理
パッケージのインストール
パッケージの追加は rye add
コマンドを使用します
$ rye add flask
バージョンを指定することも可能です
$ rye add "flask>=2.0"
blackやpytestのような開発時のみインストールしたいライブラリは --dev
オプションを渡すことで区別できます。
$ rye add --dev black
上記のコマンドを実行し、flaskとblackを加えた場合、pyproject.tomlは以下のように記述されています。(該当箇所を抜粋しています)
[project] dependencies = ["flask>=2.0"] [tool.rye] dev-dependencies = ["black~=23.3.0"]
rye add
でpyproject.tomlにパッケージを追加しただけでは、インストールされません。
上述の rye sync
を実行し、pyproject.tomlの内容をryeが管理するPython環境に同期させる必要があります。
$ rye sync
syncを実行すると、flask, blackのインストールが始まります。lockfileであるrequirements.lock, requirements-dev.lockの内容も更新されます。
syncコマンドではデフォルトでは dev-dependenciesのパッケージも含めてインストールを行います。
dev-dependenciesのパッケージを除外してインストールを行いたい場合、 --no-dev
を実行オプションに加える必要があります。
$ rye sync --no-dev
パッケージのアンインストール
パッケージの削除は rye remove
コマンドを使用します。
$ rye remove flask
rye add
の場合と同様、ryeの管理するPytohn環境とpyproject.tomlの内容と同期させるために、 sync
コマンドを実行する必要があります。
4. 仮想環境での実行
ryeが管理するPython環境で実行するためには、 rye run
コマンドを使用します。
例えば以下のコマンドを実行すると、 rye pin 3.10
で固定したPython 3.10が実行されていることを確認できます。
$ rye run python --version > Python 3.10.11
Optional
グローバルツールの利用
ryeではグローバルに使えるツールの管理も行えます。例えば、コードフォーマッターのblackをプロジェクトごとにインストールを行うのは面倒だと思います。
その場合、 rye install
コマンドを使用することで、グローバルツールを追加できます。
$ rye install black
これにより、現在のプロジェクト以外の場所でもblackを実行することができるようになります。
現在インストールされているグローバルツールの一覧を確認できます
$ rye tools list > black
グローバルツールの削除を行う場合、 rye uninstall
コマンドを使用します。
$ rye uninstall black
ryeの設定
rye自体の設定はデフォルトでは ~/.rye
を読み取りに行きます。設定ファイルを環境変数 RYE_HOME
で変更できるため、独自の設定ファイルを作成することもできます。
~/.rye
の中でRustが使用してるPython仮想環境を管理しています。
config.toml
を書き換えることで、独自の設定に変更できますが、設定できるパラメータは少ないようです。
https://rye-up.com/guide/config/
pyproject.toml
ryeでのpyproject.tomlの要素
https://rye-up.com/guide/pyproject/
project.dependencies
PEP631のpyproject.tomlのdependenciesと同様に、パッケージの依存関係を管理する機能。
tool.rye.dev-dependencies
開発用のパッケージの依存関係を管理する機能。
tool.rye.excluded-dependeincies
インストールしないパッケージの依存関係を管理する機能。
rye add
コマンドに --excluded
オプションをつけると、この要素に追加されます。
$ rye add --excluded pytest
この場合、pytestが他のパッケージの依存関係に含まれていても、インストールされなくなります。
tool.rye.managed
現在のプロジェクトをryeで管理するかのON/OFF。
tools.rye.sources
依存関係のソースを管理する機能。デフォルトではryeはPyPIからパッケージを取得するため、ユーザーが任意のソースからパッケージを取得したい場合に変更可能となっています。
tools.rye.workspace
reyはデフォルトではサブフォルダでも共通の仮想環境が適用されます。workspace.membersを記述することで、適応対象のサブディレクトリを制御することができます。
tools.rye.scripts
rye run {script内容}
のように 、ryeのPython環境で実行される独自コマンドを作成できる機能。
scripts用のキーが用意されています。
- cmd
実行コマンドの設定ができます。
[tool.rye.scripts] server = { cmd = "flask run --app ./hello.py" }
上記の設定の場合、以下のコマンドを実行するとFlaskのアプリケーションが立ち上がります。
$ rye run server
- env
コマンド実行時に環境変数を渡すことができます。
[tool.rye.scripts] devserver = { cmd = "flask run --debug", env = { FLASK_APP = "./hello.py" } }
上記の設定の場合、 FLASK_APP
の環境変数に./hello.pyが設定された状態でコマンドの処理が実行されます。
- chain
複数の処理を繋げた内容をコマンドにできます。
[tool.rye.scripts] lint = { chain = ["lint:black", "lint:flake8" ] } "lint:black" = "black --check src" "lint:flake8" = "flake8 src"
上記の設定の場合、 lint
というコマンドで、lint:black
と lint: flake8
のコマンドを順次実行することがでます。
まとめ
pythonのパッケージ管理ツールryeの機能をまとめました。
ryeは個人利用目的のツールであるため、作者のArmin Ronacher氏が注意してるように、今後メンテナンスが行われていくかは不明です。
自分はpyenv + poetryで環境を用意してた口ですが、ryeの使い勝手の良さに感動したので、一度試してみることをお勧めします。