nikkie-ftnextの日記

イベントレポートや読書メモを発信

使ってみようpyproject.toml! projectの設定に使う項目のみんなを紹介するぜ!!

はじめに

8/17(木)のみんなのPython勉強会は数学特集です。みんな来てね!
nikkieです。

先日pyproject.tomlというファイルをおすすめする記事を書きました。

思ってもみなかった反響があり(継続的な流入🙌)、困惑もしているのですが、今回は続編として、pyproject.tomlを使ったprojectの設定で扱うみんなを紹介していきます!

目次

pyproject.tomlとは

私の主張は「setup.pyに代えて、pyproject.tomlを試してみてください」です(上記エントリ参照)。
数ヶ月前の私は「pyproject.toml、学習コストも高そうだし、使うメリットってあるのかな」と消極的でした。
Pythonコミュニティ的に推されていると認識し、重い腰を上げて使ってみたら便利だったのでおすすめしたくなった次第です。

なお、拡張子のtomlは「Tom's Obvious Minimal Language」という言語(書式)です。

(言語仕様は日本語でも読めました)

今回はprojectテーブル([project])に書くキーをざーっと見ていきます。
私がよく見る例のページを参照します。
https://packaging.python.org/ja/latest/specifications/declaring-project-metadata/#example

projectにこれだけは絶対設定してくれよな!

2つあります!
これらを設定しないと悪魔よりワルですね(悪すぎて色々怒られますね)

name

https://packaging.python.org/ja/latest/specifications/pyproject-toml/#name

プロジェクトの名前。

[project]
name = "unko"

(冒頭で紹介した記事の設定値を使っています1

setup.pyでもnameでした2

version

https://packaging.python.org/ja/latest/specifications/pyproject-toml/#version

プロジェクトのバージョン。

[project]
version = "0.1"

書式はPEP 440参照。
https://peps.python.org/pep-0440/#version-scheme

setup.pyでもversionでした。

nameとversionの2点を設定するだけでprojectを最小限設定したpyproject.tomlとなります(これでpip installできます)

projectに必要に応じて設定しような!

私はPyPIにアップロードするパッケージはすべて設定するようにしています。
GitHubからインストールできるようにpyproject.tomlを含めるだけの場合は、dependenciesといった最低限です

description

https://packaging.python.org/ja/latest/specifications/pyproject-toml/#description

プロジェクトを要約する記述。

[project]
description = "Unko library"

setup.pyでもdescriptionでした。

readme

https://packaging.python.org/ja/latest/specifications/pyproject-toml/#readme

プロジェクトの説明全体 (すなわち README)。

文字列で指定する場合は、「pyproject.toml からの相対パスで示した」扱いとなります。

[project]
readme = "README.rst"

インラインテーブルで相対パスとcontent-typeを示すこともできます。

[project]
readme = {file = "README.txt", content-type = "text/markdown"}

setup.pyではlong_descriptionに指定していました(long_description_content_typeも)。

requires-python

https://packaging.python.org/ja/latest/specifications/pyproject-toml/#requires-python

プロジェクトが要求する Python のバージョン。

[project]
requires-python = ">=3.8"

Python 3.8以上」というような指定をします。
setup.pyではpython_requiresでしたね(語の並びが入れ替わってる〜!!)

license

https://packaging.python.org/ja/latest/specifications/pyproject-toml/#license

2つの書き方があります。
1つは、インラインテーブルのfileキーでライセンスファイルの(pyproject.tomlからの)相対パスを指定する書き方。

[project]
license = {file = "LICENSE"}

もう1つは、textキーでライセンスを示す文字列を値とする書き方

[project]
license = {text = "MIT License"}

setup.pyでもlicenseでした。

authors/maintainers

https://packaging.python.org/ja/latest/specifications/pyproject-toml/#authors-maintainers

authorやmaintainer1人につき、nameとemailのキーで指定できます(インラインテーブルの配列)。
キーは片方だけでもかまいません。
以下に示す例はごく一部ですので、ぜひリンク先の例をご確認ください

[project]
authors = [
  {name = "ftnext", email = "ftnext@example.com"},
  {name = "nikkie"},
]

setup.pyでは項目が分かれていました。

  • author
  • author_email
  • maintainer
  • maintainer_email

keywords

https://packaging.python.org/ja/latest/specifications/pyproject-toml/#keywords

プロジェクトに関するキーワード。

[project]
keywords = ["egg", "bacon"]

setup.pyでもkeywordsでした。

classifiers

https://packaging.python.org/ja/latest/specifications/pyproject-toml/#classifiers

プロジェクトに適合する Trove 分類子。

PyPIでパッケージを見ると、左側のサイドバーの中に「分類」というゾーンがあります3

ここを指定するのがclassifiers!

[project]
classifiers = [
    "Development Status :: 3 - Alpha",
    "License :: OSI Approved :: MIT License",
    "Programming Language :: Python",
    "Programming Language :: Python :: 3.10",
]

設定値は以下で確認しています。
https://pypi.org/pypi?%3Aaction=list_classifiers
(めちゃめちゃいっぱいあるよ〜〜)

setup.pyでもclassifiersでした

dependencies/optional-dependencies

https://packaging.python.org/ja/latest/specifications/pyproject-toml/#dependencies-optional-dependencies

設定値の中では、ここが一番の推しポイント!
setup.pyではinstall_requiresextras_requireだったんですよ

  • install_requires ➡️ dependencies
  • extras_require ➡️ optional-dependencies

わ か り や す い!!

依存するライブラリを列挙します4

[project]
dependencies = [
    "httpx",
]

optional-dependenciesは、別にテーブルを作ります

[project.optional-dependencies]
dev = [
    "pytest",
]

必要に応じて設定しよう! project関連のテーブル

project.urls

https://packaging.python.org/ja/latest/specifications/pyproject-toml/#urls

  • Homepage
  • Documentation
  • Repository
  • Changelog

と指定できます。
classifiersのように、PyPIでの表示(「プロジェクトのリンク」)に反映されます。

エントリポイント

https://packaging.python.org/ja/latest/specifications/pyproject-toml/#entry-points

以下のテーブルです

  • [project.scripts]
    • コマンドラインから呼び出せるようコマンドの設定をします
    • setup.pyのconsole_scriptsに対応
  • [project.gui-scripts]
  • [project.entry-points]
    • 使用例

終わりに

pyproject.tomlでprojectの設定をするときに使うみんなを紹介しました。
「ちょっとだけ背伸びしてpyproject.tomlを使ってみようかな」という方が1人でもいらっしゃったらとても嬉しいです。

pyproject.tomlはprojectの設定の他に、開発で使うツールの設定を書くという使い方もできます5(これも便利🤗)。
どんどん使おう、pyproject.toml!

変更履歴


  1. setup.pyにおける設定値は、https://setuptools.pypa.io/en/latest/userguide/declarative_config.html を参照しています
  2. https://pypi.org/project/kojo-fan-art/ より
  3. バージョンは固定しません。合わせてどうぞ