久しぶりに公開しているパッケージ(django-compositepk-model)を更新する必要が出た。
色々新し方法に変わっているようで、パッケージ作成方法をhatchに変更し、GitHubからタグ付け時に自動でパッケージ作成し登録(公開)するようにした。
PyPIの管理画面から案内が出ていた新しいパッケージの作成方法については、以下ページ。
日本語ページは以下。
https://packaging.python.org/ja/latest/guides/section-build-and-publish
色々書いてあるが、以下手順で行った。
1)pyproject.toml
を書く
プロジェクト直下にpyproject.tomlファイルを作成する。説明通りに順に自分のプロジェクト用を作成した。
- ビルドバックエンドはhatch用を設定
- バージョンについては固定値にした※
- 「実行可能なスクリプトを作成する」「先進的なプラグイン」は関係なし
※バージョンアップ時には、これを書き換えて、タグ付けを行う
自分のプロジェクト構成が特殊で、hatchの標準のディレクトリ構成に合っていないので、hatch用のターゲットファイル指定を追記した。
https://hatch.pypa.io/latest/config/build
今回のパッケージの例では、以下。
https://github.com/Arisophy/django-compositepk-model/blob/main/pyproject.toml
以前のパッケージと構成が合うように、以下を追加している。
[tool.hatch.build.targets.sdist]
include = [
"compositepk-model/cpkmodel/*.py",
]
[tool.hatch.build.targets.wheel]
packages = ["cpkmodel/"]
[tool.hatch.build.targets.wheel.force-include]
"compositepk-model/cpkmodel" = "cpkmodel"
2)pyproject.tomlの確認
※本手順は、以下3-2)のGitHub上のワークフロー定義でbuildだけを動くようにして(タグを付けなければbuildのみ実行)、作成されたファイルをActionsの結果からダウンロードして確認でもOK
念のため、以前のパッケージと同じ構成でパーケージ作成されることを確認。
ローカルの開発環境で、hatchをインストールして、
pip install hatch
ビルドを行い
hatch build
pyproject.tomlの記述に問題がなく、正しい構成でパッケージが作成されることを確認した。
3)GitHub Actions CI/CD ワークフローを用いてパッケージ配布物のリリースを公開する
「TestPyPI へ公開」 と「配布パッケージに署名する」は必要ないので、以下を行う。
3-1)PyPI側でGitHubからの連携許可
https://pypi.org/manage/account/publishing/ で以下を登録。
- PyPI Project Name:PyPIのプロジェクト名
- オーナー:自分のGitHubアカウント
- Repository name:GitHubのレポジトリ名
- Workflow name:後で定義するので、適当な名前(release.yml等)
Environment nameは、空欄のままでよい。
3-2)GitHub側でワークフロー定義
.github/workflows/ ディレクトリに、上で定義したWorkflow nameのファイル名でワークフロー定義を作成する。
「配布パッケージに署名する」以下は無視で、基本そのままコピーして、以下のパッケージ名を変えれば良い。
url: https://pypi.org/p/<package-name> # Replace <package-name> with your PyPI project name
あとは、起動条件が単にpush時のままでは、ビルドは毎回動くので、以下を参考に条件を付けるとよい。
今回のパッケージの例は以下。
https://github.com/Arisophy/django-compositepk-model/blob/main/.github/workflows/release.yml
Actionのバージョンは、古いとワーニングが出るので、現時点での最新に書き換えている。
4)実行
パッケージを更新する場合には、
- pyproject.tomlファイルのバージョンを書き換え
- タグ付けしてpush
すれば、自動でパッケージのバージョンアップ登録されるようになる。