Poetryについての Today(※最近) I learned 2ネタ目です1
Poetryを使ったプロジェクトでアプリケーションをDockerイメージにするとき、イメージからはPoetryを除きたい派なのですが(poetry run想定してなくて、ビルド中のみ使う)、
— nikkie / にっきー 技書博 け-04 Python型ヒント本 (@ftnext) 2024年8月17日
poetry exportでpoetry.lockからrequirements.txtが作れるのを利用するとよいかも〜https://t.co/YuSbuXjMLd
目次
yamoryのドキュメントより
脆弱性管理クラウド yamory のドキュメントからコマンドを知りました。
requirements.txtを生成します。Poetry を使用しているプロジェクトの場合pyproject.tomlがあるディレクトリで下記を実行します。
先日Poetryを導入したDjangoプロジェクトを例にします。
https://github.com/ftnext/django-bad-apps/tree/dd70560bd9f9fb26ec7630d7462f6bf45e8f2959/sql-injection
.
└── sql-injection/
├── bad_sql_injection/
├── poetry.lock
└── pyproject.toml
pyproject.toml(ならびに poetry.lock)があるディレクトリで
% poetry --version Poetry (version 1.8.2) % poetry export -f requirements.txt --without-hashes | cut -d';' -f1 asgiref==3.8.1 django-environ==0.11.2 django==4.2.15 psycopg2==2.9.9 sqlparse==0.5.1 typing-extensions==4.12.2 tzdata==2024.1
この出力をrequirements.txtに書き込めばよいですね(> requirements.txt)。
形式変換できるのです!
poetry export
ドキュメントを確認します。
https://python-poetry.org/docs/cli/#export
-fは--format。
constraints.txt2とrequirements.txtの2つをサポートしています(デフォルトは後者)
--without-hashesを付けたとき、cutする前の出力はこのようになっています。
django==4.2.15 ; python_version >= "3.9" and python_version < "4.0"
これをセミコロンで区切って1列目を取り出すことで、requirements.txtの形式に整えるわけですね。
pyproject.tomlにはdirectな依存しか記載されていませんが、poetry.lockはtransitiveな依存も含めて記載されています。
これを形式変換するだけなので、できあがるrequirements.txtにはdirectな依存もtransitiveな依存も記載されています3
directとtransitiveについてはこちらをどうぞ:
同じ情報だから片方をバージョン管理して、必要なときに変換するというのは、好みです。
雑感
(1) 気になるwarning
Warning: poetry-plugin-export will not be installed by default in a future version of Poetry.
poetry exportはPoetryのプラグイン機構で実現されているようです。
poetry self add poetry-plugin-export
https://github.com/python-poetry/poetry-plugin-export/tree/1.8.0?tab=readme-ov-file#installation
プラグインはなかなか気になります。
(2) Dockerイメージビルドに使ってみたい
冒頭のツイートにもありますが、DockerイメージにPoetryを残さないのを好む立場としては、なかなかに惹かれる技術です。
上記のDjangoプロジェクトのようにpackage-mode = falseのプロジェクトでは、アプリケーションとして稼働させる上でPoetryは必須でないことも経験しています。
そのような場合において、poetry.lockをrequirements.txtに変換できれば、pip installだけでイメージを用意できます
GitHub ActionsでPoetryをインストールし、poetry export。
Action実行中にできあがるrequirements.txtをCOPYしてDockerイメージビルドというのを試しています。