PDM 内部机制(1)

PDM 内部机制(1)

💡 原文英文,约2000词,阅读约需8分钟。
📝

内容提要

这篇文章介绍了PDM的锁文件,锁文件用于存储固定的软件包版本和依赖关系。PDM是一个带有锁文件的包管理器,与pip等没有锁文件的包管理器不同。锁文件的生成和使用过程中需要考虑当前环境和Python版本。文章还介绍了环境标记和元数据的相关概念。PDM的锁文件支持不同的锁定策略。

🔎

延伸解读

锁文件的核心作用与PDM的定位

PDM的锁文件用于固定所有可能安装的软件包版本、来源和校验和,目标是提供可重现的Python环境。与pip等无锁文件的包管理器不同,PDM在安装时会确保锁文件存在且有效,必要时自动生成。这解释了为何pip能安装而PDM可能失败:PDM的解析更严格,需考虑锁文件约束。

跨版本锁定与requires-python的约束

PDM采用跨版本锁定,在一个锁文件中记录所有包版本及其环境信息,而非仅针对当前环境。requires-python字段限制项目可安装的Python版本范围,PDM会确保锁文件在该范围内所有Python版本上都能工作。因此,即使当前使用Python 3.10,若项目声明requires-python>=3.8,PDM仍会拒绝仅支持3.9+的包版本,以保证兼容性。

环境标记的传播与记录方式

环境标记(如sys_platform == "win32")用于指定包的安装条件。在跨版本锁定中,标记无法在锁定时求值,因此会原样记录,并在安装时判断。标记会沿依赖树传播:子包继承父包的标记,多个父包则用逻辑或组合,不同标记用逻辑与组合。最终结果记录在锁文件的markers字段中,安装时直接读取,无需遍历依赖树。

元数据假设与性能权衡

PDM假设同一版本的不同文件元数据相同,并基于版本而非文件进行锁定。这提高了性能,但可能不准确,因为不同文件(如sdist和wheel)的依赖可能不同,且sdist元数据需构建生成。PDM还假设每个版本包含所有平台的文件,但实际可能缺失。这些权衡在大多数情况下成立,但极端情况可能导致解析失败。

❓

Q&A

PDM的锁文件有什么作用?

PDM的锁文件用于存储固定的软件包版本和依赖关系,提供可重现的Python环境。

PDM与pip的主要区别是什么?

PDM是一个带有锁文件的包管理器,而pip则没有锁文件,PDM支持锁文件的生成和使用。

如何生成PDM的锁文件?

可以通过运行命令`pdm lock`来生成PDM的锁文件,PDM会确保锁文件的存在和有效性。

什么是requires-python字段,它的作用是什么?

requires-python是PEP 621定义的元数据字段,用于限制软件包可安装的Python环境。

环境标记在PDM中如何使用?

环境标记用于指定软件包的安装条件,PDM在解析依赖时会考虑这些标记。

PDM的锁文件支持哪些锁定策略?

PDM的锁文件支持多种锁定策略,具体策略将在后续文章中介绍。

🏷️

标签

➡️

继续阅读