Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

PEP 627 – 记录已安装项目

作者:
Petr Viktorin <encukou at gmail.com>
BDFL 委托
Paul Moore <p.f.moore at gmail.com>
讨论至:
Discourse 帖子
状态:
最终版
类型:
标准跟踪
主题:
打包
创建日期:
2020年7月15日
决议:
Discourse 消息

目录

重要

本 PEP 是一份历史文档。最新的规范《记录已安装项目》在 PyPA 规范页面维护。

×

有关如何提出更改的建议,请参阅PyPA 规范更新流程

摘要

本 PEP 澄清并更新了 PEP 376(已安装 Python 分发包数据库),将其重写为互操作性标准。它将标准的规范位置移至 Python 打包授权机构 (PyPA) 标准存储库,并制定了修改指南。

已安装的 .dist-info 目录中的两个文件被设为可选:RECORDPEP 376 列为强制,但建议“系统包”可以省略),以及 INSTALLER

动机

Python 打包正在从依赖特定工具(Setuptools 和 pip)转向一个工具生态系统和工具无关的互操作性标准。

PEP 376 并非以互操作性标准编写。它描述了特定工具和库的实现细节,且规范不足,为实现定义的行为留下了很大空间。

这是一个从 PEP 376 中“提炼”标准,澄清并重写它以使其与工具无关的提案。

本 PEP 的目标是拥有一个更好的标准,而不必是一个完美的标准。一些问题留待以后澄清。

基本原理变更

PEP 376 的基本原理侧重于两个问题

  • 安装项目的方式太多,这使得互操作变得困难。
  • 没有 API 来获取有关已安装分发包的信息。

新文档仅关注已安装项目信息的磁盘格式。提供安装、卸载或查询此信息的 API 留待工具实现。

标准和变更流程

记录已安装项目》(以前称为《已安装 Python 分发包数据库》)的规范标准是 packaging.python.org 上的文档。对文档的任何更改(除了琐碎的语言或排版修复)都必须通过 PEP 流程进行。

该文档是规范性的(带有示例以帮助理解)。修改它的 PEP(例如本 PEP)包含预计会过时的附加信息,例如基本原理和兼容性考虑。

拟议标准与本 PEP 一起作为拉取请求提交给 packaging.python.org

变更及其基本原理

重命名为“记录已安装项目”

该标准已从《已安装 Python 分发包数据库》重命名为《记录已安装项目》。

虽然将文件放置在磁盘上已知位置可能被认为是“数据库”,但它并非大多数人听到该术语时所想的。PyPA 在“记录已安装分发包”标题下链接到 PEP 376

PyPA 词汇表将“分发包”(或“分发包包”以防止与例如 Linux 分发包混淆)定义为“带版本存档文件[...]”。由于安装 Python 代码可能存在其他方式,而不是从存档文件安装,因此文档使用“已安装项目”而不是“已安装分发包”。

删除实现细节

所有特定于工具和库的细节均已删除。项目安装的机制也已省略:文档侧重于最终状态。一个例外是卸载算法的草图,它旨在更好地解释 RECORD 文件的目的。

.egg-info.eggsetuptoolsdistutils 特有的格式)的引用已省略。

明确允许附加文件

.dist-info 目录允许包含规范中未指定的文件。当前工具已经这样做了。

规范中的一个注释提到了 wheels.dist-info 目录中的文件。当前工具将这些文件复制到已安装的 .dist-info——这是进一步标准化工作需要牢记的一点。

澄清 RECORD 文件

CSV 方言被指定为 Python csv 模块的默认方言。这解决了文件名中处理双引号和行终止符的极端情况。

RECORD 中相对路径的“基准”被指定为相对于 .dist-info 目录,而不是特定于工具的 --install-lib--prefix 选项。

现在,哈希大小 字段都是可选的(对于任何文件,而不仅仅是 .pyc.pyoRECORD)。不建议省略它们,但 *.pycRECORD 本身除外。(请注意,PEP 376 对哪些是可选的不明确;从字面上看,其文本和示例相互矛盾。尽管如此,“两个字段都是可选的”是对 PEP 376 的合理解释。另一种选择是强制——而不是推荐——哪些文件可以不记录哈希和大小,并随着新用例的出现及时更新该列表。)

新规范明确规定 RECORD 文件现在必须包含已安装项目的所有文件(.pyc 文件的例外仍然存在)。由于工具使用 RECORD 进行卸载,不完整的文件列表可能会在用户环境中引入孤立文件。另一方面,这意味着如果文件完整列表未知,则无法记录某些文件的哈希值。

包含卸载算法的草图,以阐明文件主要目的和内容。

工具不得卸载/删除缺少 RECORD 文件的项目(除非它们有外部信息,例如 Linux 发行版的系统包管理器中的信息)。

在 Windows 上,RECORD 中的文件可以使用 /\ 分隔。PEP 376 对此不明确:它在一处要求正斜杠,但在一个 Windows 特定示例中显示了反斜杠。

可选的 RECORD 文件

RECORD 文件变为可选。并非所有工具都能轻松生成 Python 特定格式的已安装文件列表。

具体来说,当项目由 Linux 系统打包系统安装时,RECORD 文件是不必要的,该系统有自己的方式来跟踪文件、卸载文件或检查其完整性。将 RECORD 文件与磁盘和系统包数据库保持同步会非常脆弱,并且没有 RECORD 文件比与实际不符的文件更好。

(完全披露:本 PEP 的作者是 Fedora Linux 发行版中活跃的 RPM 打包者。)

可选的 INSTALLER 文件

INSTALLER 文件也变为可选,并指定仅用于信息目的。它仍然是一个包含安装程序名称的单行文本文件。

此文件最初是为了区分由 Python 安装程序 (pip) 安装的项目与由其他包管理器 (例如 dnf) 安装的项目。曾尝试使用此文件来阻止 pip 更新或卸载它未安装的包。

我们的目标是支持互操作工具,而基于哪个工具安装了包来采取任何行动与该目标背道而驰。

工具应该使用功能检测,而不是依赖安装程序名称。当前文档提供了一种粗略的方法,使项目不受 Python 工具的影响:省略 RECORD 文件。

另一方面,安装程序名称可能对用户的提示很有用。

为了与此文件的新目的保持一致,新规范允许在 INSTALLER 中使用任何 ASCII 字符串,而不是小写标识符。它还建议使用命令行命令(如果可用)。

REQUESTED 文件:从规范中移除

REQUESTED 文件现在被视为特定于工具的扩展。

根据 PEP 376,当项目由用户直接请求安装时,而不是自动满足另一个项目的依赖项时,应写入 REQUESTED。没有此标记文件的项目在不再需要时可以卸载。

尽管有标准,许多现有安装程序(包括旧版本的 pip)从未写入此文件。在“不再需要时可以移除”的项目与仅由忽略 REQUESTED 的工具安装的项目之间没有区别。因此,该文件目前无法用于其预期目的(除非工具可以使用附加的、非标准的信息)。

澄清

在可能的情况下,术语(例如 nameversion)通过引用现有规范进行限定。

延迟的想法

为了限制本 PEP 的范围,一些改进明确留待未来的 PEP 处理

  • RECORD 文件的编码
  • 限制或命名 .dist-info 中可以出现的文件
  • 标记由用户直接请求安装的项目与为满足依赖项而安装的项目之间的区别,以便后者在不再需要时可以删除。

来源:https://github.com/python/peps/blob/main/peps/pep-0627.rst

上次修改:2025-02-01 08:55:40 GMT