PyPIパッケージの管理に、Poetryを使うとrequirements.txtを使うよりも、以下の点で便利そうだった。
- 開発/本番環境で使うパッケージの管理を別に行うことができる(npmのdevdependenciesのような感じ)
- 直接プロダクトが依存しているパッケージのみを管理することができる
- 依存パッケージに依存しているパッケージのバージョンは poetry.lock で管理され、いつの間にか依存パッケージのバージョンが上がって動かなくなることはない(npmの、package-lock.json、yarn.lockのような感じ)
- 依存パッケージのバージョンアップも1コマンドでできる
- virtualenv.in-project trueを設定しておくと、venvを使用して.venvディレクトリにパッケージをインストールする(.venvディレクトリはVSCodeでも自動で認識するので便利)
自分で使いそうなコマンドをまとめました。
Poetryのインストール
pip install --user poetry
環境の分離に使うvenvを使い、.venvディレクトリを自動で作成して使うように設定する
poetry config virtualenvs.in-project true
開発でのみ使うパッケージのインストール
poetry add -D black
アプリケーションから依存しているパッケージのインストール
poetry add flask
別のマシンで、開発環境を構築する場合
# 分離環境の作成
python -m venv .venv
# パッケージのインストール
poetry install
プログラムの実行
.venv下にパッケージはインストールされているので、.venvで実行する
.venv/bin/python api.py
もしくは、Poetry経由で実行する
poetry run python api.py
パッケージのアップデート
poetry update
コンテナ化
コンテナの中では.venvを用いず、Poetryの環境分離機能を使う(VSCodeと共有せず、特に.venvディレクトリである必要はないため)
FROM python:3.8.2
# Poetryのインストール
RUN pip install poetry==1.0.5
WORKDIR /app
# 依存パッケージのインストール
COPY poetry.lock pyproject.toml ./
# devは除く
RUN poetry install --no-dev
# アプリケーションの格納
COPY api.py ./
# ...
# Poetry経由で実行する
CMD ["poetry", "run", "python", "api.py"]