Skip to content

PEP 621 元数据#

项目元数据存储在 pyproject.toml。规范由 PEP 621PEP 631PEP 639 定义。阅读 PEP 中的详细规格。

在本文档的后续部分中,如果未明确给出,元数据应写在 [project] 表下。

多行描述#

您可以将长描述拆分为多行,这要归功于 TOML 对多行字符串的支持。 只需记住转义换行符,以便最终描述仅出现在包元数据中的一行。 在转义换行符时,缩进也将被移除:

1
2
3
4
5
6
description = """\
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, \
    sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. \
    Ut enim ad minim veniam, quis nostrud exercitation ullamco \
    laboris nisi ut aliquip ex ea commodo consequat.\
"""

请参阅 TOML 的字符串规范

软件包版本#

1
2
[project]
version = "1.0.0"
1
2
3
4
5
6
[project]
...
dynamic = ["version"]

[tool.pdm]
version = { source = "file", path = "mypackage/__version__.py" }

版本将从 mypackage/__version__.py 文件中读取,查找样式为: __version__ = "{version}".

pdm-backend 文档中的动态项目版本 获取有关其他配置的更多信息。

Python 版本#

Python 的所需版本被指定为字符串 requires-python:

1
2
3
4
5
6
7
8
requires-python = ">=3.9"
classifiers = [
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.9",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    ...
]

!!! Note: 根据 PEP 621, PDM 不允许动态更新 classifiers 部分,就像一些其他不兼容的工具那样。 因此,如果计划在 PyPI 上发布软件包,您还应包括适当的 trove 分类器 如上所示。

许可证#

许可证被指定为字符串 license:

1
2
3
4
5
license = {text = "BSD-2-Clause"}
classifiers = [
    "License :: OSI Approved :: BSD License",
    ...
]

!!! Note: 根据 PEP 621, PDM 不允许动态更新 classifiers 部分,就像一些其他不兼容的工具那样。 因此,如果计划在 PyPI 上发布软件包,您还应包括适当的 trove 分类器 如上所示。

依赖项规范#

project.dependencies 是遵循 PEP 440PEP 508 的依赖规范字符串数组。

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[project]
...
dependencies = [
    # 命名需求
    "requests",
    # 带有版本规范符的命名需求
    "flask >= 1.1.0",
    # 带有环境标记的需求
    "pywin32; sys_platform == 'win32'",
    # URL 需求
    "pip @ git+https://github.com/pypa/[email protected]"
]

可选依赖项#

您可以将一些依赖项标记为可选的,这类似于 setuptoolsextras_require 参数。

1
2
3
4
5
6
7
[project.optional-dependencies]
socks = [ 'PySocks >= 1.5.6, != 1.5.7, < 2' ]
tests = [
  'ddt >= 1.2.2, < 2',
  'pytest < 6',
  'mock >= 1.0.1, < 4; python_version < "3.4"',
]

要安装一组可选依赖项:

1
pdm install -G socks

-G 选项可以多次给出以包含多个组。

上下文变量扩展#

取决于您使用的构建后端,PDM 将在依赖字符串中扩展一些变量。

环境变量#

1
2
[project]
dependencies = ["flask @ https://${USERNAME}:${PASSWORD}/artifacts.io/Flask-1.1.2.tar.gz"]
1
2
[project]
dependencies = ["flask @ https://{env:USERNAME}:{env:PASSWORD}/artifacts.io/Flask-1.1.2.tar.gz"]

此处 查找更多用法

不必担心凭证泄露,环境变量将在需要时被扩展,并且在锁文件中保持不变。

相对路径#

当您从相对路径添加包时,PDM 将自动将其保存为 pdm-backendhatchling 的相对路径。

例如,如果运行 pdm add ./my-package,它将在 pyproject.toml 中产生以下行。

1
2
[project]
dependencies = ["my-package @ file:///${PROJECT_ROOT}/my-package"]
1
2
[project]
dependencies = ["my-package @ {root:uri}/my-package"]

默认情况下,hatchling 不支持 直接引用 在依赖字符串中,您需要在 pyproject.toml 中打开它:

1
2
[tool.hatch.metadata]
allow-direct-references = true

当安装或锁定时,相对路径将根据项目根目录进行扩展。

控制台脚本#

以下内容:

1
2
[project.scripts]
mycli = "mycli.__main__:main"

将被转换为 setuptools 风格:

1
2
3
4
5
entry_points = {
    'console_scripts': [
        'mycli=mycli.__main__:main'
    ]
}

此外,[project.gui-scripts] 将被转换为 setuptools 风格中的 gui_scripts 入口点组。

入口点#

其他类型的入口点通过 [project.entry-points.<type>] 部分给出,具有与 [project.scripts] 相同的格式:

1
2
[project.entry-points.pytest11]
myplugin = "mypackage.plugin:pytest_plugin"

如果入口点名称包含点或其他特殊字符,请用引号将其括起来:

1
2
[project.entry-points."flake8.extension"]
myplugin = "mypackage.plugin:flake8_plugin"