[python]poetryの導入と感想
私はこれまでpythonプロジェクトのライブラリ管理には
pip-tools
を利用していましたが、
現在のプロジェクトで
poetry
を導入しました。
その理由は
- PyPIのbuildとpublish機能がある
- poetry自体が枯れてきて、安定感が出てきた
となります。
web上に溢れているpoetryに関する記事の多くは
poetryに関する良い所
しか取り上がれらていませんが、
この記事では
エンジニアとして現実的な目線
でpoetry導入のメリットとデメリットについて話していきます。
結論
poetryの導入に関して結論から言うと
わざわざ他のプロジェクトのライブラリ管理ツールから変更する必要性は感じないが、PyPI公開ライブラリや新規プロジェクトへ導入するなら検討しても良い
になります。
なぜなら、poetryを使っても生産性が上がるわけでありません。
なので、わざわざ既存のプロジェクトで労力をかけてまで導入する必要ないと感じたからです
次はpoetry導入のメリットとデメリットについて説明します。
poetryのメリット
pythonプロジェクトのライブラリ管理にpoetryを導入するメリットは
pythonプロジェクト管理に必要な機能が多く備わっている
ということになります。
具体的には
- 厳密なライブラリのversion管理
- 開発時にしか使わないモジュールの別管理
- PyPIのbuildとpublish機能
- 仮想環境の管理
になります。
もちろん他のツールでも上記は可能なのですが
poetry
コマンドで全てを実行できるのは、非常に楽です。
もちろんこのメリットの裏にはデメリットもあります。
poetryのデメリット
pythonプロジェクトのライブラリ管理にpoetryを導入するデメリットは
poetry以外にも覚えることが多い
です。
つまり
学習コストが高い
ということです。
poetryを使うには、poetryの使い方以外にもpyenvなどの仮想環境の知識も必要になります。
特に面倒だと感じたのは
docker + vscode で Remote-Containers の機能を使う場合の環境構築です。
これはには苦戦しました。
結論から言うと、
poetryを仮想環境でなく、グローバル環境でライブラリ管理するようにすれば良いだけ
なのですが、
最初はうまくvscodeでライブラリの環境が読み込めず、vscodeの機能が働かずイライラしました。
今回は私は
新規プロジェクト
なのでpoetryを導入しましたが、既存である程度規模の大きいプロジェクトなら導入していなかったと思います。
これは最初に述べたように
pip-tools
などの他のツールでも十分にライブラリ管理の仕様は満たせるからです。
結論
poetryは後発のライブラリ管理ツールなので、pip-tools等より機能的には優れています。
しかし、現在のpythonのデフォルト開発環境となっている
docker + vscode (Remote-Containers)で使うと、色々と問題が発生します。
簡単な解決策は
グローバル環境でライブラリ管理する
になりますが、これだとpoetryである必要はなく、PyPIのbuildとpublish機能以外、メリットは特にありません。
なのでライブラリ移行による影響テストが不要な
新規プロジェクト
で利用するのが良いのではないでしょうか。
おまけ
docker + vscode (Remote-Containers) でのpoetry対応方法を記載しておきます。
環境
- python:3.9.16-buster
1. poerty verisonを固定してinstall
poetryのversionは固定してinstallします。
# poerty install verisonは1,4.2で固定
RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry POETRY_VERSION=1.4.2 python3 -
versionを固定しない開発者って本当に多いです。
poetryに限らず、極力ライブラリのversionは固定する習慣をつけましょう。
2. poetryの設定
poetryの設定をdockerFile内に記載します。
# poetryの設定(venv のファイルをプロジェクトディレクトリの下には置かない、並行installをしない、venv を作らずグローバルにパッケージをインストール、インストール)
RUN poetry config virtualenvs.in-project false && poetry config installer.parallel false && poetry config virtualenvs.create false && poetry install --no-root
最初に記載した
poetry config virtualenvs.in-project
はなくても動きますが、値がnullになって気持ち悪いので設定しています。
この中で重要なのは
poetry config virtualenvs.create false
の部分になります。
これでパッケージがグローバルinstallされるので、vscodeでパッケージpathの設定をすることなく、補完などの機能が利用できます。
poetryを使いこなして良い開発ライフを送ってください。
参考記事
dockerでの構築の際に役立ちました。
Discussion