如何编写一个可以安装包的最小工作 pyproject.toml 文件?

How to write a minimally working pyproject.toml file that can install packages?

Pip 支持 pyproject.toml 文件,但到目前为止,新模式的所有实际使用都需要自动生成这些文件的第 3 方工具(例如 poetry 和 pip)。与已经是人类可写的 setup.py 不同,pyproject.toml 还不是(还)。

来自 setuptools docs

[build-system]
requires = [
  "setuptools >= 40.9.0",
  "wheel",
]
build-backend = "setuptools.build_meta"

但是,此文件不包含包依赖项(如 PEP 621 中所述)。 Pip 确实支持使用 pyproject.toml 安装包,但是 pep 没有指定如何在 pyproject.toml 中为官方构建系统 setuptools.

编写包依赖项

如何在pyproject.toml中编写包依赖?


相关 Whosebug 问题:

my question differ because I ask for a human-written pyproject.toml

首先,pyproject.toml 文件是“human-writable”(以及 setuptools 自己的setup.cfg).

然后,重要的是要知道在这种情况下 setuptoolspoetry 扮演所谓的角色“PEP 517 构建 back-ends",今天有很多这样的 back-ends,setuptools诗歌只是其中的两个例子。

他们中的大多数人希望他们的配置(包括依赖项)写在 pyproject.toml 中,有些人希望它在另一个文件中。


PEP 621

有一个名为 PEP 621 的标准指定了项目的元数据(包括依赖项)应如何在 pyproject.toml 文件中布置。

随着时间的推移,越来越多的构建 back-ends 添加了对 PEP 621 的支持,例如:

对于所有 PEP 621 兼容构建 back-ends,依赖项应写入 pyproject.toml 文件,如下所示:

[project]
name = "Thing"
version = "1.2.3"
# ...
dependencies = [
    "SomeLibrary ~= 2.2",
]

参考文献:


setuptools(自版本 61.0.0

PEP 621 的实验性支持已添加到 setuptools 版本 61.0.0(2022-03-24 发布):


setuptools(之前版本61.0.0

setuptools 版本 61.0.0 之前不支持在 pyproject.toml 中写入其配置(没有 PEP 621 支持)。您必须写 setup.py,或 setup.cfg,或两者的组合。

我的建议是尽量写在setup.cfgsetup.py可以短到:

import setuptools
setuptools.setup()

这样的 setup.cfg 可能如下所示:

[metadata]
name = Thing
version = 1.2.3

[options]
install_requires =
    SomeLibrary ~= 2.2
packages = find:

具体依赖项的参考资料:

顺便说一句,请注意在某些情况下可以完全省略 setup.py 文件,其中一个条件是 setup.cfg 文件和 pyproject.toml 文件是呈现并包含所有必要的信息。这是一个 pyproject.toml 的示例,它适用于 setuptools 构建后端:

[build-system]
build-backend = 'setuptools.build_meta'
requires = [
    'setuptools >= 43.0.0',
]

最后,setuptools 维护者提供了 plans,允许在 pyproject.toml 中编写配置(而不是 setup.cfgsetup.py),但我们还没有做到这一点(2021 年 10 月)。


诗歌

诗歌中,一切都在pyproject.toml中定义,但它使用poetry-specific部分。换句话说,Poetry 从今天开始不使用 PEP 621 标准,并且有一些计划在未来转向这个标准。

这个文件可以是hand-written。据我所知,没有明确需要明确安装诗歌本身(pip installpip wheel 等命令可以让你走得更远)。

pyproject.toml 文件可以很简单:

[tool.poetry]
name = 'Thing'
version = '1.2.3'

[tool.poetry.dependencies]
python = '^3.6'
SomeLibrary = '~2.2'

[build-system]
requires = ['poetry-core~=1.0']
build-backend = 'poetry.core.masonry.api'

参考文献: