🍉

Pythonのパッケージ管理をpoetryからryeへ移行した手順のメモ

2023/10/16に公開

はじめに

Pythonで作っているアプリのパッケージ管理にpoetryを使っていたのですが、ryeに変更してみました。この記事はその際のメモになります。

ryeの使い方自体は特に触れませんが、公式ページくらいは貼っておきます。
https://rye-up.com/

なぜ、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]にする

とりあえず、変えます。

pyproject.toml
- [tool.poetry]
+ [project]

authorsの形式を変更

そのままだとエラーになるので、変更します。

pyproject.toml
- authors = ["ibaraki <ibaraki@example.com>"]
+ authors = [{ name = "ibaraki", email = "ibaraki@example.com" }]

pythonのバージョン指定の変更

poetryのときはdependenciesの中にpythonも入っていてちょっとよく分からなかったのですが、
ryeは独立して書くことになるので分かりやすいです。

pyproject.toml
- [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の書き方が無難なんだろうなと思います。

pyproject.toml
- [tool.poetry.dependencies]
- boto3 = "^1.28.62"

+ dependencies = [
+     "boto3>=1.28.62,<2",
+ ]

dev-dependenciesの変更

ryeのdev-dependenciesは[tool.rye]の配下に書きます。

pyproject.toml
- [tool.poetry.dev-dependencies]
- pytest = "^5.2"
+ [tool.rye]
+ managed = true
+ dev-dependencies = [
+     "pytest>=5.2,<6",
+ ]

build-systemの変更

ビルドシステムは、以下のように書き換えます。

pyproject.toml
[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の指定はなくても動いたので消しておきます。(残すとエラーになる)

pyproject.toml
- [tool.poetry]
- packages = [
-     { include="scripts", from="." },
- ]

- [tool.poetry.scripts]
+ [project.scripts]
start = "scripts.func_start:main"
test = "scripts.test:main"

まとめ

最終的に以下のようになりました。

pyproject.toml
[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エンジニアブログ

Discussion