内容提要
这篇文章介绍了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的锁文件支持多种锁定策略,具体策略将在后续文章中介绍。