源代码分发格式

当前的标准化源代码分发格式,其标志是分发归档中存在一个 pyproject.toml 文件。这种分发的布局最初在 PEP 517 中指定,并在此处正式记录。

还存在一个遗留的源代码分发格式,它由标准库中的 distutils 模块在执行 setup.py sdist 时的行为隐式定义。本文档不试图标准化这种格式,只是指出如果遗留的源代码分发包含一个使用元数据版本 2.2 或更高版本的 PKG-INFO 文件,那么它必须遵循元数据规范中定义的适用于源代码分发的规则。

源代码分发也简称为 sdists

源代码树

一个 源代码树 是一系列文件和目录的集合——类似于版本控制系统的检出——它包含一个 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 版本。

如果元数据版本为 2.4 或更高,则源代码分发必须包含 PKG-INFOLicense-File 字段指定的所有许可证文件,这些文件相对于 sdist 根目录(包含 pyproject.tomlPKG-INFO 元数据)的相应路径。

sdist 的其他内容不要求也不定义。构建系统可以将它们构建项目所需的任何信息存储在 sdist 中。

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

源代码分发归档特性

由于直接提取 tar 文件是危险的,并且结果是平台特定的,因此源代码分发的归档特性受到限制。

使用数据过滤器解压

解压源代码分发时,工具必须要么使用 tarfile.data_filter()(例如 TarFile.extractall(..., filter='data')),要么遵循下面的 不使用数据过滤器解压 部分。

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

不使用数据过滤器解压

不直接使用 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 标准化。

  • 2024 年 12 月:许可证文件包含到源代码分发中通过 PEP 639 标准化。