こんにちは。 XI 本部 AI トランスフォーメンションセンター所属の山田です。
今回は、Python の Web アプリケーション開発環境において Poetry を利用し始めたことについて紹介します。
背景
私たちのチームではデータ分析、システム開発ともに Python を使用しています。
これまで、Python を業務で使う際にはパッケージ管理ツールにpip
を利用してきました。
しかしながら、継続的に開発・更新を繰り返すことを見越したシステム開発ではたびたび問題を引き起こすことがあり、見直しを図ることにしました。
pip で感じていた課題
まずpip
を利用時に感じていた課題を整理します。
pip install パッケージ名
で導入した際にrequirements.txt
への記載漏れというヒューマンエラーが発生する。requirements.txt
においてパッケージバージョンの記載漏れというヒューマンエラーが発生する。pip
でのパッケージ間の依存関係解決は弱く、インストールの順序関係によってはエラーが発生する。pip freeze
によるバージョン固定ファイルを手動で実施する必要があり、開発者間で異なるバージョンがインストールされ、環境差異が発生する。- 開発環境特有のパッケージ管理問題。
requirements-dev.txt
のように別ファイルで管理するコストが辛い。
上記の課題の多くは、パッケージ管理ツールを見直すことで解決可能であると判断し、見直しを実施しました。
Poetry
そして結果として、Poetry を使うことにしました。 Poetry の公式ドキュメントと GItHub リポジトリへのリンクを載せておきます。
Poetry を採用した経緯としては、もともとチーム内でも関心があったツールであり、他社でも導入事例1や利点2が紹介されていたことが大きいです。 また開発ロードマップが示されており、今後のアップデートに伴って拡充される機能が魅力的でもありました。
Poetry - Feature roadmap、https://github.com/python-poetry/poetry/issues/1856
pipとPoetryの比較
pip と Poetry の比較を表にまとめたものが以下になります。
# | pip |
poetry |
設定ファイル | requirements.txt |
pyproject.toml |
設定ファイルのサンプル |
django==4.0.1
|
[tool.poetry] name = "sample" version = "0.1.0" description = "" authors = ["username <*****@*******>"] [tool.poetry.dependencies] python = ">=3.8,<3.9" Django = "4.0.1" [tool.poetry.dev-dependencies] django-stubs = "^1.9.0" [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" |
設定ファイルに基づく依存解決 | pip install -r requirements.txt |
poetry install |
パッケージの追加方法 |
pip install <package-name> requirements.txt には手動で追記。
|
poetry add <package-name> pyproject.toml には自動で追記。
|
パッケージのlockファイル |
requirements.lock pip freeze コマンドでの手動生成
|
poetry.lock 自動生成。 poetry lock コマンドでの手動生成・更新も可能。
|
開発環境向けのパッケージ管理 |
requirements-dev.txt などで管理。 |
pyproject.toml 内の[tool.poetry.dev-dependencies] で管理。
|
開発環境向けのパッケージ追加 |
pip install -r requirements-dev.txt requirements-dev.txt などに手動で追記する必要あり。 |
poetry add -D <package-name> pyproject.toml には自動で追記。
|
Poetry 導入のメリット
もともとpip
で感じていた課題と対応する形でメリットについて整理します。
pip install パッケージ名
で導入した際にrequirements.txt
への記載漏れというヒューマンエラーが発生する。requirements.txt
においてパッケージバージョンの記載漏れというヒューマンエラーが発生する。
上記2つの課題については、Poetry によってインストール時のパッケージとバージョンが自動で追記されるため、ヒューマンエラーの発生を防げるようになりました。
pip
でのパッケージ間の依存関係解決は弱く、インストールの順序関係によってはエラーが発生する。
これまで依存関係解決について触れませんでしたが、Poetry は pip と異なるより強固な依存関係リゾルバが採用されており、順序関係によるような依存関係解決のエラーは発生しにくいようになっています。 これは Poetry の README でも強みとして記載されています。
Poetry - Why?、https://github.com/python-poetry/poetry#why
pip freeze
によるバージョン固定ファイルを手動で実施する必要があり、開発者間で異なるバージョンがインストールされ、環境差異が発生する。
Poetry ではpoetry.lock
が自動生成されます。
またpoetry.lock
が存在すればpoetry install
時は優先して読み込まれるため、開発者簡で異なるバージョンがインストールされる事象を防ぐことができます。
- 開発環境特有のパッケージ管理問題。
requirements-dev.txt
のように別ファイルで管理するコストが辛い。
Poetryでは、pyproject.toml
内の[tool.poetry.dev-dependencies]
で開発環境固有のパッケージを管理できます。
これにより、開発環境固有のパッケージも同一ファイルで管理でき、コストを削減できます。
pip から Poetry に移行するに当たって
実際に pip から Poetry へ移行するに当たって考慮すべきポイントをまとめておきます。
requirements.txt
からpyproject.toml
への移行について
まずrequirements.txt
からpyproject.toml
に移行する必要があります。
現時点では、Poetry 側では依存関係を既存のrequirements.txt
から取り入れる方法はサポートされていません。
そのため、既存の開発環境で Poetry を適用する際には、移行作業に充てる時間を多く見積もっておいた方が良いでしょう。
シェルスクリプトを使うことである程度、自動化は図れますが、pyproject.toml
を準備するコストがかかると認識しておいて損はないでしょう。
参考までに既存プロジェクトにおける Poetry への移行方法について、 Stack Overflow での質問リンクを載せておきます。
How to import requirements.txt from an existing project using Poetry、https://stackoverflow.com/questions/62764148/how-to-import-requirements-txt-from-an-existing-project-using-poetry
チームメンバーの開発環境の整備
チームで使えるように開発環境構築のドキュメントなどを整え、設定などを共有する必要があります。
例えば、私たちのチームでは Poetry によって作成される仮想環境のvenv
がプロジェクト内になるように設定するよう周知しています。
# プロジェクト内に`.venv`を置くように設定変更 poetry config virtualenvs.in-project true
新しいツールを導入する際は、このあたりの設定の意図がチームメンバーに伝わるようにすることは開発をスムーズに進める上でも重要でしょう。
CI/CD環境の更新
すでに CI/CD パイプラインがあるプロジェクトでは、Poetry を利用する方式に変更する必要があります。 GitHub Actions 上では Poetry の Actions が公開されているのでそちらを利用するのが良いでしょう。
Python Poetry Action、https://github.com/marketplace/actions/python-poetry-action
以下は、GitHub Actions において Poetry を使って依存関係解決を行う際の設定ファイルの記述例になります。
- name: Setup Poetry uses: abatilo/actions-poetry@v2.0.0 with: poetry-version: "1.1.14" - name: Install dependencies run: poetry install
まとめ
今回は、私たちのチームで Python のパッケージ管理ツールとして Poetry を利用し始めたことについて紹介しました。 似たような課題をお持ちの方はぜひ Poetry の導入を検討してみてはいかがでしょうか。
私たちは同じチームで働いてくれる仲間を探しています。AI 製品開発に興味がある方のご応募をお待ちしております。
執筆:@yamada.y、レビュー:@sato.taichi (Shodoで執筆されました)
-
サーバーアプリ開発環境(Python/FastAPI)、https://future-architect.github.io/articles/20210611a/↩
-
pipとpipenvとpoetryの技術的・歴史的背景とその展望、https://vaaaaaanquish.hatenablog.com/entry/2021/03/29/221715↩