PEP 850:Wheel 变体:提供者

PEP 850:Wheel 变体:提供者

💡 原文英文,约3300词,阅读约需12分钟。
📝

内容提要

PEP 825 扩展规定变体属性的治理与兼容性判定:可通过变体元数据中的静态特性/特性值兼容列表,或查询需显式启用的插件(Python 包,也可由工具内置或重实现)来确定。插件默认不安装执行,需用户明确授权,工具可维护可信插件列表。另定义 ABI 依赖变体提供者,借助安装器依赖解析器判断针对不同依赖版本的构建兼容性。元数据新增 providers 键,格式版本升至 0.2.0。

🔎

延伸解读

三种提供者机制:静态、插件与内置

PEP 850 为变体属性兼容性判定提供了三种方式:静态列表(static-properties)、插件查询(requires)和内置提供者(builtin)。静态列表适合已知且稳定的兼容信息,无需安装额外代码;插件适合需要动态探测系统能力的场景,但默认不安装执行;内置提供者则处理需要访问安装器内部(如依赖解析器)的检查,例如 ABI 依赖变体。三者互斥,每个命名空间必须选择其一。

安全模型:默认不执行,显式授权

插件以 Python 包形式提供,但出于安全考虑,默认不会被安装或使用。工具可以维护可信插件列表(通过 vendoring、重实现或嵌入锁文件),仅对列表外的插件要求用户显式授权。这降低了供应链攻击风险,但也可能引发“安全疲劳”——用户为省事而 blanket 启用所有插件。PEP 建议工具提供精选可信集,并推荐在隔离环境中安装插件,以减少对系统环境的影响。

ABI 依赖提供者:连接依赖解析器

ABI 依赖提供者(abi_dependency)是内置提供者,用于表达同一包版本针对不同依赖版本(如 PyTorch)构建的兼容性。它需要访问安装器的依赖解析器,因此无法通过插件 API 实现。特性名必须是依赖名,值必须是版本号的前三段,匹配语义类似 =={value}.*,且不支持非零 epoch。该命名空间不定义顺序,应排在 default-priorities.namespace 中所有顺序敏感命名空间之后。

元数据格式升级与一致性要求

变体元数据格式升至 0.2.0,新增 providers 键,其键为命名空间,值为提供者信息字典。所有在 default-priorities.namespace 中出现的命名空间都必须在 providers 中列出,且不能包含其他键。提供者信息字典必须恰好包含 static-properties、requires 或 builtin 之一,并可附加 optional、plugin-api、feature-order 等可选键。索引级元数据中的 providers 字典必须是各输入字典的并集,且相同键必须始终对应相

❓

Q&A

PEP 850 主要解决了什么问题?

PEP 850 扩展了 PEP 825,定义了变体属性如何被治理以及如何确定其兼容性。它提供了三种方式:通过变体元数据中的静态特性/特性值兼容列表、通过查询需显式启用的插件(Python 包,也可由工具内置或重实现),以及定义 ABI 依赖变体提供者来支持针对不同依赖版本的构建。

变体提供者(variant provider)有哪几种类型?

变体提供者有三种类型:1) 静态提供者,在元数据中直接定义兼容特性和特性值的静态列表;2) 插件提供者,通过 Python 包(provider plugins)在安装时查询;3) 内置提供者(builtin providers),在安装器内部实现,用于处理插件 API 无法支持的检查(如 ABI 依赖检查)。

为什么插件提供者默认不被安装或使用?

出于安全原因,插件包默认不会被安装或使用,因为安装并执行第三方代码会引入额外的攻击面(供应链攻击风险)。工具可以通过 vendoring、重实现或嵌入式锁文件等方式安全地使用受信任的插件子集,而使用不受信任的插件需要用户显式授权。

ABI 依赖变体提供者(abi_dependency)的作用是什么?

ABI 依赖变体提供者用于表达同一版本包的不同构建与不同依赖版本或版本范围的兼容性。它需要访问安装器的依赖解析器,因此被实现为内置提供者。其特性名必须是依赖名称,值必须是有效的版本段(最多三个组件),匹配方式类似于 =={value}.* 说明符。

变体元数据中 providers 键的结构是怎样的?

providers 键是一个字典,键为命名空间,值为提供者信息字典。每个提供者信息字典必须恰好包含以下键之一:static-properties(字典)、requires(列表)或 builtin(字符串)。此外可选包含 optional(布尔值);如果存在 requires,还可选包含 plugin-api(字符串);如果存在 static-properties,还可选包含 feature-order(列表)。该结构对应格式版本 0.2.0。

插件提供者的 API 端点如何指定和发现?

API 端点可以通过 requires 中的依赖字符串推断,或通过 plugin-api 键显式指定。端点使用对象引用表示法:{import_path}(:{object_path})?。插件包应安装入口点(entry point)到 variant_plugins 组,名称为推荐的命名空间名,值为 API 端点,以便工具发现。工具必须收集该组的所有入口点并使用其值确定要调用的 API 端点。

🏷️

标签

➡️

继续阅读