2023-10-21

Ryeを試してみた

python

株の取引システムのバグを修正したら、依存関係が壊れてより一層壊れた。 以前poetryとpytorchの噛み合わせが悪く導入を断念して以降、requirements.txtを使っていたが改善しないと辛さがありそうだ。 ということで職場で噂になっていたryeをインストールして使ってみることにした。

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

導入自体は非常に簡単で、公式サイトに記載されているcurlで一発で入る。 最低限の使い方は以下の通り。

初期化

bash
Copied!
$ rye init "ディレクトリ名"

pythonのバージョンの固定

bash
Copied!
$ rye pin 3.12.0

依存関係の追加

bash
Copied!
$ rye add "パッケージ名"

依存関係の更新

bash
Copied!
$ rye sync

憶える必要があることは殆ど無いのだが、これまで使ってきたパッケージマネージャーとかなり使い勝手が違う。

仮想環境周りについて

ryeでプロジェクトを初期化すると、そのディレクトリで利用されるpython自体もryeで管理される。 実際にrye pin 3.12.0を打ってみるとvenvが作成され、指定したバージョンのpythonが自動でインストールされる。 プロジェクトのディレクトリでpythonを実行すると、ryeのshimsが自動的にローカルのvenvを指すように管理してくれる。

非常に便利なのだがDockerと組み合わせる際のベストプラクティスがよくわからない。 ryeでパッケージを管理するのであれば、pythonそれ自体もryeが管理してくれるのでpytにon系のベースイメージを使う必要が無くなるはずだ。 Dockerfileとpyproject.toml両方でバージョンを管理するのも手間なのでベースイメージには汎用のやつを使うのがいいかもしれない。

https://zenn.dev/codehex/scraps/7cc3970a8c8048 https://github.com/mitsuhiko/rye/discussions/239#discussioncomment-6033855

パッケージの追加に関して

rye addコマンドは実行してもpyproject.tomlに依存関係を追加するだけで、ダウンロードやインストールは行われない。 rye syncを実行するとpyproject.tomlに記載されいている依存関係からlockファイルを生成して、lockファイルに基づいてvenvに必要なパッケージをインストールする。 poetryやyarnと違ってaddしただけではパッケージがインストールされないのは注意しておく必要がある。

ソースコード

Rye自体はRustで書かれている非常にコンパクトなツールだ。 コードベースも小さく、Rustに詳しくなくてもChatGPTを頼れば全然読める分量になっている。 コアとなる依存解決やパッケージのインストールの処理は実質的にpip-toolsのラッパーとして実装されているようだ。 pip-toolsの挙動がわかっていないが既存のエコシステムの延長線にあるラッパーとして実装されているのであれば、rye特有のつらみ、みたいなものも発生しにくそうではある。

おわりに

キャッチアップ含めて数時間で移行できて満足を 今のところ特に不満もないし、今後個人でpythonを使うときはryeで管理しようと思う。