如何编写一个可以安装包的最小工作 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 问题:
这个问题要求一种自动生成 pyproject.toml
的方法,我的问题有所不同,因为我要求的是人工编写的 pyproject.toml
.
my question differ because I ask for a human-written pyproject.toml
首先,pyproject.toml
文件是“human-writable”(以及 setuptools 自己的setup.cfg
).
然后,重要的是要知道在这种情况下 setuptools 和 poetry 扮演所谓的角色“PEP 517 构建 back-ends",今天有很多这样的 back-ends,setuptools 和 诗歌只是其中的两个例子。
他们中的大多数人希望他们的配置(包括依赖项)写在 pyproject.toml
中,有些人希望它在另一个文件中。
PEP 621
有一个名为 PEP 621 的标准指定了项目的元数据(包括依赖项)应如何在 pyproject.toml
文件中布置。
随着时间的推移,越来越多的构建 back-ends 添加了对 PEP 621 的支持,例如:
enscons
flit_core
(see flit
)
hatchling
(see hatch
)
pdm-pep517
(see pdm
)
setuptools
(自版本 61.0.0
起的实验性支持)
trampolim
whey
- 可能更多...
对于所有 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.cfg
,setup.py
可以短到:
import setuptools
setuptools.setup()
这样的 setup.cfg
可能如下所示:
[metadata]
name = Thing
version = 1.2.3
[options]
install_requires =
SomeLibrary ~= 2.2
packages = find:
具体依赖项的参考资料:
- https://setuptools.readthedocs.io/en/latest/userguide/dependency_management.html
- https://www.python.org/dev/peps/pep-0508/
- https://www.python.org/dev/peps/pep-0440/
顺便说一句,请注意在某些情况下可以完全省略 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.cfg
或 setup.py
),但我们还没有做到这一点(2021 年 10 月)。
诗歌
在诗歌中,一切都在pyproject.toml
中定义,但它使用poetry-specific部分。换句话说,Poetry 从今天开始不使用 PEP 621 标准,并且有一些计划在未来转向这个标准。
这个文件可以是hand-written。据我所知,没有明确需要明确安装诗歌本身(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'
参考文献:
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 问题:
这个问题要求一种自动生成
pyproject.toml
的方法,我的问题有所不同,因为我要求的是人工编写的pyproject.toml
.
my question differ because I ask for a human-written
pyproject.toml
首先,pyproject.toml
文件是“human-writable”(以及 setuptools 自己的setup.cfg
).
然后,重要的是要知道在这种情况下 setuptools 和 poetry 扮演所谓的角色“PEP 517 构建 back-ends",今天有很多这样的 back-ends,setuptools 和 诗歌只是其中的两个例子。
他们中的大多数人希望他们的配置(包括依赖项)写在 pyproject.toml
中,有些人希望它在另一个文件中。
PEP 621
有一个名为 PEP 621 的标准指定了项目的元数据(包括依赖项)应如何在 pyproject.toml
文件中布置。
随着时间的推移,越来越多的构建 back-ends 添加了对 PEP 621 的支持,例如:
enscons
flit_core
(seeflit
)hatchling
(seehatch
)pdm-pep517
(seepdm
)setuptools
(自版本61.0.0
起的实验性支持)trampolim
whey
- 可能更多...
对于所有 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.cfg
,setup.py
可以短到:
import setuptools
setuptools.setup()
这样的 setup.cfg
可能如下所示:
[metadata]
name = Thing
version = 1.2.3
[options]
install_requires =
SomeLibrary ~= 2.2
packages = find:
具体依赖项的参考资料:
- https://setuptools.readthedocs.io/en/latest/userguide/dependency_management.html
- https://www.python.org/dev/peps/pep-0508/
- https://www.python.org/dev/peps/pep-0440/
顺便说一句,请注意在某些情况下可以完全省略 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.cfg
或 setup.py
),但我们还没有做到这一点(2021 年 10 月)。
诗歌
在诗歌中,一切都在pyproject.toml
中定义,但它使用poetry-specific部分。换句话说,Poetry 从今天开始不使用 PEP 621 标准,并且有一些计划在未来转向这个标准。
这个文件可以是hand-written。据我所知,没有明确需要明确安装诗歌本身(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'
参考文献: