Pip 支持
pyproject.toml
文件,但到目前为止,新模式的所有实际使用都需要自动生成这些文件的第 3 方工具(例如,poetry 和 pip)。不像setup.py
已经是人类可写的,pyproject.toml
(还)不是。
来自 setuptools 文档,
[build-system]
requires = [
"setuptools >= 40.9.0",
"wheel",
]
build-backend = "setuptools.build_meta"
但是,此文件不包含包依赖项(如 PEP 621 中所述)。 Pip确实支持使用
pyproject.toml
安装包,但是pep没有指定如何在pyproject.toml
中为官方构建系统编写包依赖setuptools
.
如何在
pyproject.toml
中编写包依赖项?
相关的 StackOverflow 问题:
这个问题要求一个自动生成
pyproject.toml
的方法,我的问题不同,因为我要求一个人工编写的pyproject.toml
.
我的问题不同,因为我要的是人工写的
pyproject.toml
首先,
pyproject.toml
文件总是“human-writable”。
然后,重要的是要知道在这种情况下 setuptools 和 Poetry 扮演所谓的“build back-ends”(在“PEP 517”的意义上)的角色,并且有今天有很多这样的构建后端,setuptools 和Poetry(技术上
poetry-core
)只是其中的两个例子。
截至今天,似乎我所知道的大多数(如果不是全部)构建后端都希望它们的配置(包括依赖项)以 pyproject.toml
编写。它也被称为“PEP 621”。
[project]
pyproject.toml
文件中的
[project]
部分:“Declaring project metadata”。
这是我所知道的构建后端列表,遵循这个[project]
enscons
flit_core
(见flit
)
hatchling
(见hatch
)
maturin
meson-python
pdm-backend
(见pdm
)
scikit-build-core
setuptools
(从版本61.0.0
开始的实验性支持)
trampolim
whey
比较表.
对于所有[project]
pyproject.toml
文件中,如下例所示:
[project]
name = "Thing"
version = "1.2.3"
# ...
dependencies = [
"SomeLibrary >= 2.2",
"AnotherLibrary >= 4.5.6",
]
参考文献:
setuptools(之前的版本61.0.0
)
setuptools在61.0.0
之前的版本中不支持在
pyproject.toml
中写入项目的打包元数据。你必须写一个
setup.cfg
,或一个
setup.py
,或两者的组合。我的建议是尽量写。这样的
setup.cfg
可能是这样的:
[metadata]
name = Thing
version = 1.2.3
[options]
install_requires =
SomeLibrary >= 2.2
AnotherLibrary >= 4.5.6
packages = find:
在大多数情况下,setup.py
可以完全省略,也可以短至:
import setuptools
setuptools.setup()
具体依赖关系参考:再次注意,在大多数情况下,可以完全省略
setup.py
文件,其中一个条件是
setup.cfg
文件和一个
pyproject.toml
文件存在并包含所有必要的信息。这是一个
pyproject.toml
的示例,它适用于setuptools 构建后端:
[build-system]
build-backend = 'setuptools.build_meta'
requires = [
'setuptools',
]
诗歌
在Poetry中,一切都在pyproject.toml
中定义,但它使用Poetry特定的部分
[tool.poetry]
而不是标准化的[project]
部分。有一些计划在未来的 Poetry 中添加对该标准的支持。
这个文件可以手写。据我所知,没有明确需要明确安装诗歌本身(像pip install
和
pip wheel
这样的命令可以让你走得更远)。
pyproject.toml
文件可以很简单:
[tool.poetry]
name = 'Thing'
version = '1.2.3'
[tool.poetry.dependencies]
python = '^3.6'
SomeLibrary = '>= 2.2'
AnotherLibrary >= '4.5.6'
[build-system]
requires = ['poetry-core~=1.0']
build-backend = 'poetry.core.masonry.api'
参考文献: