最近の python ライブラリのパッケージング手法を調査

最近の python package の記述の仕方で、 pyproject.toml なる作法があるのでメモ。

元々、 setup.pysetup.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

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.cfgpyproject.toml の役割が被っていると思うのだが両方要るのだろうか。

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 に書けるようになりそうではある。