Pythonのパッケージ管理をpoetryからryeへ移行した手順のメモ
はじめに
Pythonで作っているアプリのパッケージ管理にpoetryを使っていたのですが、ryeに変更してみました。この記事はその際のメモになります。
ryeの使い方自体は特に触れませんが、公式ページくらいは貼っておきます。
なぜ、poetryからryeに乗り換えようと思ったか?
pyenvを気にしなくて良くなるので、環境構築の手間が減ると思ったからです。
poetryの場合はPython自体の管理が別途必要なのでpyenvも使っていたのですが、環境構築とかよく分からないエラーが出ることがあり面倒くさいこともあったので、全部まとめて管理できるryeの方が良さそうだなぁと判断して移行してみました。
移行手順
とりあえず不要になるものを消す
poetry.lock
.venv
.python-version
poetry.lock
は、ryeでは使わないので消します。
.venv
は、ryeで作り直すので消します。
.python-version
は、残すと過去のpythonバージョンに依存した状態が続くので消しました。(依存させた状態キープしたい場合は残しても良いと思います。)
pyproject.toml
を書き換える
[tool.poetry]を[project]にする
とりあえず、変えます。
- [tool.poetry]
+ [project]
authorsの形式を変更
そのままだとエラーになるので、変更します。
- authors = ["ibaraki <ibaraki@example.com>"]
+ authors = [{ name = "ibaraki", email = "ibaraki@example.com" }]
pythonのバージョン指定の変更
poetryのときはdependenciesの中にpythonも入っていてちょっとよく分からなかったのですが、
ryeは独立して書くことになるので分かりやすいです。
- [tool.poetry.dependencies]
- python = "~3.11"
+ requires-python = ">=3.11,<3.12"
dependenciesの変更
poetryは、[tool.poetry.dependencies]配下に書いてましたが、ryeでは[project]配下にdependenciesを書きます。
前述のpythonのバージョン指定もですが、poetryはバージョン指定がpackage.jsonの形式なのに対してryeではpipの形式になっているので注意が必要です。個人的にはpoetryの形式が馴染みがあってよかったのですが、pythonなのでryeの書き方が無難なんだろうなと思います。
- [tool.poetry.dependencies]
- boto3 = "^1.28.62"
+ dependencies = [
+ "boto3>=1.28.62,<2",
+ ]
dev-dependenciesの変更
ryeのdev-dependenciesは[tool.rye]の配下に書きます。
- [tool.poetry.dev-dependencies]
- pytest = "^5.2"
+ [tool.rye]
+ managed = true
+ dev-dependencies = [
+ "pytest>=5.2,<6",
+ ]
build-systemの変更
ビルドシステムは、以下のように書き換えます。
[build-system]
- requires = ["poetry-core>=1.0.0"]
- build-backend = "poetry.core.masonry.api"
+ requires = ["hatchling"]
+ build-backend = "hatchling.build"
scriptsの変更
scriptsを指定している場合は、[tool.poetry.scripts]を[project.scripts]に書き換えます。
またpackagesの指定はなくても動いたので消しておきます。(残すとエラーになる)
- [tool.poetry]
- packages = [
- { include="scripts", from="." },
- ]
- [tool.poetry.scripts]
+ [project.scripts]
start = "scripts.func_start:main"
test = "scripts.test:main"
まとめ
最終的に以下のようになりました。
[project]
name = "sample-app"
version = "0.1.2"
description = ""
authors = [{ name = "ibaraki", email = "ibaraki@example.com" }]
readme = "readme.md"
requires-python = ">=3.11,<3.12"
dependencies = [
"boto3>=1.28.62,<2",
"fastapi>=0.63.0,<1",
"gunicorn>=20.0.4,<20",
"uvicorn[standard]>=0.13.3,<1",
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=5.2,<6",
"autopep8>=1.5.5,<2"
]
[project.scripts]
start = "scripts.func_start:main"
test = "scripts.test:main"
パッケージのインストール
rye sync
所感
思ってたより簡単に移行できました。
ちょっとだけ詰まったのは、バージョン指定の方法に慣れてなく上限指定(<2
みたいなやつ)を書き忘れて、パッケージのバージョンが上がりすぎて正常に動かなくなったくらいです。
また、移行前には想定していなかった良い点として、ryeはlockファイルがそのままrequirements.txt
として使えるので本番環境を作る時にryeのインストールが不要でpipだけで構築出来た。ということが挙げられます。
以上です。
NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion
poetryからryeに乗り換える際に参考にさせていただきました。ありがとうございました。
最近のryeだと[tool.hatch.build.targets.wheel]セクションが必須になっていたので共有させていただきます。[tool.poetry]のpackagesと大体同じでよさそうです。