nikkie-ftnextの日記

イベントレポートや読書メモを発信

poetry.lock をもとに requirements.txt を生成する(poetry export)

Poetryについての Today(※最近) I learned 2ネタ目です1

目次

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.txt2requirements.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イメージビルドというのを試しています。


  1. 1ネタ目
  2. constraints.txt はこのようにして使うものなので、世の中の殆どの Python 製アプリの開発では使う必要がないでしょう。
  3. 例えば、pip-compileした出力と同じ情報です