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

Posted

技术标签:

【中文标题】如何编写可以安装包的最小工作 pyproject.toml 文件?【英文标题】:How to write a minimally working pyproject.toml file that can install packages? 【发布时间】:2021-01-16 21:37:55 【问题描述】:

Pip 支持 pyproject.toml 文件,但到目前为止,新模式的所有实际使用都需要一个自动生成这些文件的第三方工具(例如,诗歌和 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中写包依赖?


相关 *** 问题:

How to init the pyproject.toml file

这个问题要求一种自动生成pyproject.toml 的方法,我的问题不同,因为我要求的是人工编写的pyproject.toml

【问题讨论】:

【参考方案1】:

PEP 621

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

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

pdm flit trampolim enscons whey 可能更多...

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

pyproject.toml 文件是“人类可写”(以及setup.cfg)。我会在这里给setuptoolspoetry一个答案。

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


设置工具

截至今天(2021 年 10 月),setuptools 不支持将其配置写入 pyproject.toml。您仍然必须编写 setup.pysetup.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:

关于依赖关系的具体参考:

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.cfgsetup.py),但我们还没有( 2021 年 10 月)。


诗歌

poetry 中,所有内容都在 pyproject.toml 中定义(但它使用 poetry-specific 部分,即:它不使用 PEP 621 标准)。

此文件可以手写。据我所知,没有必要明确安装诗歌本身(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'

参考文献

https://python-poetry.org/docs/pyproject/ https://python-poetry.org/docs/dependency-specification/

【讨论】:

@Keto 这能回答你的问题吗?有什么可能需要澄清才能接受这个答案? 好的,谢谢。虽然这不是我喜欢听到的答案,但这是正确且可以接受的答案。答案值得更新,因为 setuptools 和其他工具采用 PEP 621(特别是 package dependency)。 一些工具开始支持它。但它非常年轻。我已经在回答中提到了pdm。后来其他一些构建后端也添加了对 PEP621 的支持,但我不记得具体是哪些,可能看一下flittrampolimenscons 等。 @Keto "虽然这不是我喜欢听到的答案",你的意思是什么?你的期望是什么? 有一个包叫ppsetuptools。

以上是关于如何编写可以安装包的最小工作 pyproject.toml 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何最小化 webpack 包的大小?

错误:无法为 gevent 构建***,这是安装基于 pyproject.toml 的项目所必需的

pyproject.toml 文件是做啥用的?

MacOS Python安装which is required to install pyproject.toml-based projects解决办法

MacOS Python安装which is required to install pyproject.toml-based projects解决办法

MacOS Python安装which is required to install pyproject.toml-based projects解决办法