源分发格式#

源分发格式的当前标准格式通过分发存档中存在 pyproject.toml 文件来识别。此类分发的布局最初在 PEP 517 中指定,并在此正式记录。

还存在旧版源分发格式,它由执行 setup.py sdist 时标准库中 distutils 模块的行为隐式定义。本文件不尝试对这种格式进行标准化,但需要注意的是,如果旧版源分发包含使用元数据版本 2.2 或更高版本的 PKG-INFO 文件,则它必须遵循元数据规范中定义的源分发规则。

源分发也简称为sdist

源树#

源树是一组文件和目录(如版本控制系统检出),其中包含一个 pyproject.toml 文件,该文件可用于从包含的文件和目录构建源分发。PEP 517PEP 518 指定了 pyproject.toml 必须包含什么内容才能被视为源树。

源分发文件名#

sdist 的文件名在 PEP 625 中标准化。文件名必须采用 {name}-{version}.tar.gz 的形式,其中 {name} 根据与二进制分发相同的规则进行规范化(请参阅 二进制分发格式),而 {version} 是项目版本的规范化形式(请参阅 版本规范)。

文件名中的名称和版本组件必须与文件中包含的元数据中存储的值匹配。

生成源分发文件的代码必须为该文件指定一个符合此规范的名称。这包括 构建后端build_sdist 钩子。

处理源分发文件的代码可以通过 .tar.gz 后缀和文件名中恰好有一个连字符来识别源分发文件。执行此操作的代码随后可以使用文件名中的分发名称和版本,而无需进一步验证。

源分发文件格式#

.tar.gz 源分发 (sdist) 包含一个名为 {name}-{version}(例如 foo-1.0)的顶级目录,其中包含包的源文件。名称和版本必须与存储在文件中的元数据匹配。此目录还必须包含 pyproject.toml 规范 中定义格式的 pyproject.toml,以及包含 核心元数据规范 规范中所述格式的元数据的 PKG-INFO 文件。元数据必须至少符合元数据规范的 2.2 版。

sdist 的其他内容不是必需的或未定义的。构建系统可以在 sdist 中存储他们构建项目所需的任何信息。

tarball 应使用现代 POSIX.1-2001 pax tar 格式,该格式指定基于 UTF-8 的文件名。特别是,源分发文件必须可以使用带有 open 标志‘r:gz’的标准库 tarfile 模块进行读取。

源分发存档功能#

由于按原样提取 tar 文件很危险,并且结果是特定于平台的,因此源分发的存档功能受到限制。

使用数据过滤器解包#

在提取源分发时,工具必须使用 tarfile.data_filter()(例如 TarFile.extractall(..., filter='data')),或者遵循下面的不使用数据过滤器解包部分。

作为例外,在没有 hasattr(tarfile, 'data_filter')PEP 706)的 Python 解释器上,通常使用该过滤器(直接或间接)的工具可能会警告用户并忽略此规范。在这种情况下,可用性(例如完全信任存档)和安全性(例如拒绝解包)之间的权衡留给工具。

不使用数据过滤器解包#

不直接使用 data 过滤器的工具(例如,为了向后兼容,允许其他功能或不使用 Python)必须遵循本节。(在撰写本文时,data 过滤器也遵循本节,但将来可能会不同步。)

以下文件在sdist存档中无效。在遇到此类条目时,工具应通知用户,不得解包该条目,并且可能会因失败而中止

  • 将被放置在目标目录之外的文件。

  • 指向目标目录之外的链接(符号链接或硬链接)。

  • 设备文件(包括管道)。

以下内容也无效。工具可以将它们视为上述内容,但不是必需的

  • 文件名或链接目标中带有 .. 组件的文件。

  • 指向不属于存档的文件的链接。

工具可以将链接(符号链接或硬链接)解包为常规文件,使用存档中的内容。

在提取sdist存档时

  • 文件名称中的前导斜杠必须删除。(如今这是 tar 解包的标准行为。)

  • 对于每个 mode(Unix 权限)位,工具必须

    • 对新文件/目录(分别)使用平台的默认值,

    • 根据存档设置位,或

    • 对于不可执行文件使用 rw-r--r-- (0o644) 中的位,对于可执行文件和目录使用 rwxr-xr-x (0o755) 中的位。

  • mode 位(setuid、setgid、sticky)必须清除。

  • 建议保留用户可执行位。

更多提示#

鼓励工具作者考虑 tarfile 文档中进一步验证的提示如何应用于他们的工具。

历史#

  • 2020 年 11 月:本规范的原始版本已通过 PEP 643 批准。

  • 2021 年 7 月:定义了源代码树。

  • 2022 年 9 月:源代码分发文件的名称已通过 PEP 625 标准化。

  • 2023 年 8 月:源代码分发存档功能已通过 PEP 721 标准化。