肉球でキーボード

MLエンジニアの技術ブログです

pythonパッケージ管理ツールryeを使う


Pythonパッケージ管理ツール ryeの使い勝手がよかったので使用方法をまとめました。

ryeとは

GitHub: https://github.com/mitsuhiko/rye

flaskの作者である Armin Ronacher氏 (GitHubアカウント @mitsuhiko)が個人利用目的で作成した、Pythonのパッケージ関係管理ツールです。内部実装はRustです。

ryeが作成された思想がリポジトリ Should Rye Exist? のDiscussionページに書かれています。

Should Rye Exist?: XKCD #927

Disucssion中の図にあるように、従来のPythonのパッケージ管理は”様々な標準”が存在し、このばらつきを統一しようと新しくパッケージ管理ツールを導入しても、”新たな標準が追加されるだけ”となり、真のパッケージ管理の標準化を行えていないと指摘しています。

そのためArmin Ronacher氏は this is why I never wanted to publish rye とコメントし、公開を躊躇っていたようです。

同氏はRustのcargoのように、Pythonのプロジェクト管理を行うデフォルト機能が備わることを望んでいて、その1つの形がryeと指摘しています。

https://rye-up.com/guide/

公式ドキュメントでは 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と似ています。

  1. プロジェクトの作成
  2. pythonバージョンの指定
  3. 依存関係の管理
  4. 仮想環境での実行

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:blacklint: flake8 のコマンドを順次実行することがでます。

まとめ

pythonのパッケージ管理ツールryeの機能をまとめました。

ryeは個人利用目的のツールであるため、作者のArmin Ronacher氏が注意してるように、今後メンテナンスが行われていくかは不明です。

自分はpyenv + poetryで環境を用意してた口ですが、ryeの使い勝手の良さに感動したので、一度試してみることをお勧めします。

参考