きっかけ
現在、以下の2つのPythonパッケージをメンテナンスしています:
以前はsetup.pyを使ってパッケージ化していましたが、11月にNJUloginを更新した際に次のような警告が表示されました:
そのため、新しいpyproject.toml方式でパッケージ化することにしました。その時は急遽Poetryを学んでNJUloginに適用しましたが、今日mijia-apiを更新するついでに同じように適用しようとしたところ、使い方を忘れてしまっていたので、ブログに記録しておきます。今後はPoetryを使って依存関係を管理する機会が増えそうです。
Poetry
Poetryの公式サイトでの位置づけは「Python packaging and dependency management made easy」です。使い方はnpmに似ていて(Node.jsに詳しい方ならわかると思います)、コマンドラインで依存関係を管理するファイルを変更します。
ただ、poetryは少し長いので、これからはpopと呼ぶことにします。
インストール
ドキュメントを直接ご覧ください: https://python-poetry.org/docs/#installation
ここではpipxを使ってインストールしました。
既存プロジェクトの初期化
以下のpyproject.tomlファイルが生成されます。
ただし、私のパッケージには大文字が含まれているため、[tool.poetry]の下のnameを変更すると同時に、手動でpackages項目を追加し、さらにsetup.pyから他の設定も追加する必要がありました:
Poetry仮想環境の作成と依存関係のインストール
デフォルトでは~/.cache/pypoetryに仮想環境が作成されますが、pop configで変更できます。詳細はこちらのドキュメントをご覧ください。私はプロジェクトディレクトリ内に置く方が好みです:
その後、requirements.txtから依存関係を一つずつインストールできます。以下のコマンドで依存関係がpyproject.tomlファイルに書き込まれ、poetry.lockが生成されます:
Poetryの大きな利点は、依存関係をツリー形式で表示できることです:
これで、元のsetup.pyを削除できます。
パッケージ化と公開
バージョンはpoetry-dynamic-versioningを使って動的に指定できるので、毎回pyproject.tomlを編集してバージョン番号を指定する必要がありません。
これで、以下の1行のコマンドで簡単にビルドできます:
twineが~/.pypircにPyPIのトークンを保存するのとは異なり、Poetryでは追加の設定が必要です:
そして公開できます!