pyproject.toml 中的 [tool.poetry] 和 [project] 表有什么区别? [已关闭]

问题描述 投票:0回答:2

背景

因此,我尝试按照本教程创建一个新的 Python 包:https://packaging.python.org/en/latest/tutorials/packaging-projects/

正如教程所说,在我的

pyproject.toml
中我应该有这样的结构:

[project]
name = "example_package_YOUR_USERNAME_HERE"
version = "0.0.1"
authors = [
  { name="Example Author", email="[email protected]" },
]
description = "A small example package"

但是当我用

poetry init
创建这个文件时,它创建了这个结构:

[tool.poetry]
name = "example_package_YOUR_USERNAME_HERE"
version = "0.0.1"
authors = [
  { name="Example Author", email="[email protected]" },
]
description = "A small example package"

两者之间的主要区别是

[project]
而不是
[tool.poetry]
节标题。 我还看到,当
poetry
 中没有 
[tool.poetry]
 部分时,
pyproject.toml

无法对项目执行任何操作

所以我的问题是:

  1. 这两者有什么区别?

  2. 我的

    pyproject.toml
    中应该只有一个还是同时有两个?如果我应该保留两者,它应该包含什么?

  3. 如果应该只有

    [tool.poetry]
    ,我是否需要遵循与
    [project]
    相同的内容和子部分规则?例如,
    [project.urls]
    将重命名为
    [tool.poetry.urls]

  4. 在 PyPI 上发布的最佳、面向未来的选择是什么?还是没有区别?

  5. [build-system]
    poetry-core
    更改为
    setuptools
    是个好主意吗?或者我应该保留
    poetry-core

setuptools pypi python-packaging python-poetry pyproject.toml
2个回答
25
投票

1。这两者有什么区别?

[project]
部分已标准化(也称为PEP-621)。但Poetry比该标准的创建要早,因此它首先使用自己的部分
[tool.poetry]
Poetry 计划添加对标准化
[project]
的支持(请参阅
python-poetry/poetry/issues/3332
python-poetry/roadmap/issues/3
),但这需要时间。

两者之间的差异非常小,它们基本上是相同包元数据的不同表示法。最显着的区别(您应该关注的区别)是关于声明依赖项的符号。这就是分歧最关键的地方。

2。我的 pyproject.toml 中应该只有一个还是同时有两个?如果我应该保留两者,它应该包含什么?

你应该只有一个。您必须选择一个构建后端。如果您的构建后端是

poetry-core
那么您需要
[tool.poetry]
部分。如果您选择需要
[project]
的构建后端(setuptools 就是这种情况),那么这就是您应该拥有的。

3。如果只有

[tool.poetry]
,我是否需要遵循与
[project]
相同的内容和子部分规则?例如
[project.urls]
将重命名为
[tool.poetry.urls]

这并不完全是一一对应的,存在一些差异。如果您使用 Poetry,请遵循 Poetry 的文档。或者如果您使用其他东西(setuptools

等),则为
[project]规范

4。在 PyPI 上发布的最佳、面向未来的选择是什么?还是没有区别?

这由您(和您的团队)决定。有人可能会说,选择遵循

[project]
标准的构建后端更加面向未来,但这只是众多标准中的一个。下表比较了做出此类选择时可以考虑的一些功能:

5。将

[build-system]
poetry-core
更改为
setuptools
是个好主意吗?或者我应该保留
poetry-core

Poetry“开发工作流程工具”不允许使用除

poetry-core
之外的任何其他构建后端。因此,如果您想继续在您的项目中使用 Poetry,您别无选择,只能继续使用
poetry-core
作为构建后端。


1
投票

[project]
中的
pyproject.toml
部分是强制性的。如果该条目丢失,构建工具(在
[build-system]
部分中定义)必须动态添加它。我想这正是
poetry
所做的。

来自文档

本规范中定义的键必须位于 pyproject.toml 中名为 [project] 的表中。任何工具都不能向此表添加本规范未定义的键。对于希望在 pyproject.toml 中存储自己的设置的工具,它们可以使用构建依赖项声明规范中定义的 [tool] 表。缺少 [project] 表隐式意味着构建后端将动态提供所有键。

所以您在使用

[project]
时不需要
poetry
。如果更改构建系统,则必须将 pyproject.toml 转换为符合 PEP 621。

© www.soinside.com 2019 - 2024. All rights reserved.