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

Ket*_*eto 16 setuptools python-packaging python-poetry pyproject.toml pep517

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

setuptools 文档

[build-system]
requires = [
  "setuptools >= 40.9.0",
  "wheel",
]
build-backend = "setuptools.build_meta"
Run Code Online (Sandbox Code Playgroud)

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

我如何编写包依赖项pyproject.toml


相关的 StackOverflow 问题:

sin*_*roc 26

PEP 621

2020 年 12 月

有一个称为PEP621的标准,它指定项目的元数据(包括依赖项)应如何在pyproject.toml文件中布局。

2021 年 1 月

pdm似乎增加了对PEP 621表示法的支持

2021 年 5 月

更多构建后端添加了对PEP 621 的支持,例如:


我的问题有所不同,因为我要求人工编写 pyproject.toml

pyproject.toml文件是“人类可写的”(以及setup.cfg)。我将在这里给出setuptools诗歌的答案。

但首先,重要的是要知道在这种情况下setuptools诗歌的行为类似于所谓的构建后端,如今有多个这样的后端可用,setuptools只是其中之一。其他构建后端包括flitpymsbuildpdm等。他们中的一些人希望他们的配置(包括依赖项)被写入pyproject.toml,有些人希望它在另一个文件中。


设置工具

截至今天(2020 年 10 月),setuptools不支持在pyproject.toml. 您仍然必须编写 asetup.py或 asetup.cfg或两者的组合。

我的建议是尽可能多地写在 中setup.cfg,并且setup.py可以尽可能短:

import setuptools
setuptools.setup()
Run Code Online (Sandbox Code Playgroud)

这样的setup.cfg可能看起来像这样:

[metadata]
name = Thing
version = 1.2.3

[options]
install_requires =
    SomeLibrary ~= 2.2
packages = find:
Run Code Online (Sandbox Code Playgroud)

有关依赖项的具体参考:

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

[build-system]
build-backend = 'setuptools.build_meta'
requires = [
    'setuptools >= 43.0.0',
]
Run Code Online (Sandbox Code Playgroud)

最后,还有计划setuptools的维护者,以允许写入配置pyproject.toml(而不是setup.cfgsetup.py),但我们现在还没有(2020年10月)。


诗歌

诗歌中,一切都在pyproject.toml.

这个文件可以是手写的。据我所知,没有严格的必要明确安装诗歌本身(诸如pip install和 之类的命令pip 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'
Run Code Online (Sandbox Code Playgroud)

参考资料

  • Python 文档已更新为类似信息 https://packaging.python.org/en/latest/tutorials/packaging-projects/ (2认同)