というタイトルは煽りで、個人的にはまだ時期尚早な感じもあると思いますが。
いずれはこちらが標準になるでしょうし。なんだかんだで結構苦労したので、setuptools
を使うがsetup.py
は使わずにpyproject.toml
とsetup.cfg
を使ってパッケージを作る方法をメモしておきます。
pyproject.toml
って?
ざっくりいうと、みんなsetup.py
を書いたり動かしたりするのに疲れたのだと思います。
pyproject.toml
について規定しているPEP 518では、setup.py
自体を動かすために必要な依存パッケージを定義する標準的な方法がないことがモチベーションとされています。個人的には、setup_requirements.txt
でも用意すればいいのでは、と感じましたが。まぁ、みんなsetup.py
に疲れたのだと思います。
いずれにせよ、setuptools
の他にも、poetry
やflit
などのビルドツールもあるらしく、今はsetuptools
がデファクトスタンダードだけど、ずっと主流とは限らないよねー、標準的な方法を作っておきたいねー、ていうか、setup.py
に疲れたんだよ、ということだと思います。
pyproject.toml
でsetuptools
を使うには
pyproject.toml
を以下のようにします。
[build-system]
requires = ["wheel", "setuptools"]
build-backend = "setuptools.build_meta"
setup.cfg
を書こう
続いて、setup.py
の代わりにsetup.cfg
を作ります。
ぶっちゃけこれは、setuptools.setup()
の引数を設定ファイルの形式にしただけですが、[metadata]
と[options]
に項目を分けて書かなければいけません。
setuptools公式ドキュメントのQuick StartとConfiguring setup() using setup.cfg filesに詳細が載っています。
参考までに、私の関わっているプロジェクトのsetup.cfg
を以下に示します。
[metadata]
name = braket-backend-blueqat
version = 0.0.1-pre
description = Braket backend for blueqat
long_description = file: README.md
long_description_content_type = text/markdown
license = Apache-2.0
author = gyu-don
author_email = kato@blueqat.com
classifiers =
Development Status :: 3 - Alpha
License :: OSI Approved :: Apache Software License
Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.8
[options]
packages = find:
install_requires =
blueqat >= 0.4.2
amazon-braket-sdk >= 1.5.13
ほとんどsetup.py
と同じですね。
なお、attr:
やfile:
など、いくつか、設定を書く際に便利なものがあります。setup.py
でREADME.md
の中身を読んでいたのとかが詳細はやはりドキュメントに書かれています。
なお、version
の指定にattr:
を使うことも考えたのですが、その場合、一旦自分自身をimport
することになるので、ビルド環境に自分自身のinstall_requires
が必要となり、それは面倒なのでやめました。
代わりにGitHub Actionsを使ってsetup.cfgをもとに_version.pyを更新することで解決しています。
ビルドをしよう
python -m build
で、忌々しいsetup.py
なしでビルドができます。
No module named build
というエラーが出る場合は pip install build
をしてから、再度python -m build
をしてください。
setup.cfg
があればsetup.py
も簡単に書ける
せっかくsetup.py
を消し去ったのになぜ、、、という気もするのですが。もしsetup.py
も欲しい場合、setup.cfg
があればsetup.py
は以下だけで構いません。
from setuptools import setup
setup()
なお、setup.py
が必要となる場面のひとつに、editableなインストールがあります。pip install .
はsetup.py
がなくてもできるのですが、pip install -e .
はsetup.py
がないと対応していないようです。
いかがでしたか
よきPythonライフを!