最近の python ライブラリのパッケージング手法を調査
最近の python package の記述の仕方で、 pyproject.toml なる作法があるのでメモ。
元々、 setup.py や setup.cfg で記述していたのだけどこれに変わるものらしい。 setup.py はともかく setup.cfg が大変分かりにくいと思っていました。 というか、何か調べにくい。 setup.py を宣言的に書けるよ、詳しくは setup.py のリファンンスを見て。みたいになっているのだけど、 書き方がよくわからんことが多かった。
unknown: blockquote => {"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"2013年に distribute は setuptools にマージされた","position":{"start":{"line":14,"column":3,"offset":420},"end":{"line":14,"column":41,"offset":458}}}],"position":{"start":{"line":14,"column":3,"offset":420},"end":{"line":14,"column":41,"offset":458}}}],"position":{"start":{"line":14,"column":1,"offset":418},"end":{"line":14,"column":41,"offset":458}}}
pyproject.toml
(2019)pyproject.toml とは何か
unknown: blockquote => {"type":"blockquote","children":[{"type":"paragraph","children":[{"type":"text","value":"pyproject.toml は Node.js の package.json などのように、そのプロジェクトに関する様々なことを定義できるファイルとして存在しています","position":{"start":{"line":20,"column":3,"offset":567},"end":{"line":20,"column":87,"offset":651}}}],"position":{"start":{"line":20,"column":3,"offset":567},"end":{"line":20,"column":87,"offset":651}}}],"position":{"start":{"line":20,"column":1,"offset":565},"end":{"line":20,"column":87,"offset":651}}}
なるほど。
pyproject の build-system
setuptools
[build-system]
requires = [
"setuptools>=42",
"wheel"
]
build-backend = "setuptools.build_meta"
[build-system]
requires = ["setuptools>=45", "wheel", "setuptools_scm>=6.2"]
なるほど。 setup.cfg と pyproject.toml の役割が被っていると思うのだが両方要るのだろうか。
(2021)PyPIにパッケージを公開する手順の整理
pyproject.toml には build-backend の指定だけを記述して、 setup.cfg と併用するということでよさそう。
setup.py & setup.cfg
setup.py
from setuptools import setup
setup()
setup.cfg: metadata
setup.cfg: options
setup.cfg: options.entry_points
setup.cfg:
poetry
[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
練習
https://github.com/ousttrue/glglue に使ってみる。 結局、 setup.cfg を使っているのとあまり変わらず。 setuptools_scm による git tag を version 化する技を覚えた。 あと、github actions。 そのうち、 setup.cfg の内容を pyproject.toml に書けるようになりそうではある。