十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

conda 中的 PyPI Wheel 元数据解析与包描述实践——以 service_identity 17.0.0 的 DESCRIPTION.rst 为实例

conda 中的 PyPI Wheel 元数据解析与包描述实践——以 service_identity 17.0.0 的 DESCRIPTION.rst 为实例 conda 中的 PyPI Wheel 元数据解析与包描述实践——以 service_identity 17.0.0 的 DESCRIPTION.rst 为实例【免费下载链接】condaA system-level, binary package and environment manager running on all major operating systems and platforms.项目地址: https://gitcode.com/GitHub_Trending/co/conda导读本文以 conda 仓库测试数据目录中service_identity-17.0.0.dist-info/DESCRIPTION.rst为切入口完整解读 PyPI wheel 发行包中“包描述文件”的内容与结构并深入剖析 conda 是如何通过conda.plugins.prefix_data_loaders.pypi.pkg_format中的元数据解析器读取METADATA、PKG-INFO与DESCRIPTION.rst等文件、从而识别 Python 发行包并建立 conda 记录的。读完本文你将掌握 wheel 元数据目录的完整构成、各文件在 conda 解析流程中的角色以及如何通过仓库测试用例验证这套解析逻辑。一、这份文档是什么一个被 conda 收录的 wheel 元数据描述文件tests/data/env_metadata/py36-osx-whl/lib/python3.6/site-packages/service_identity-17.0.0.dist-info/DESCRIPTION.rst是 PyPI 发行包service_identity17.0.0 在打包为 wheel 时写入*.dist-info元数据目录中的包描述文件long_description格式为 reStructuredText。它位于 conda 仓库的测试夹具目录tests/data/env_metadata/py36-osx-whl/下模拟了一个基于 Python 3.6 的 macOS 环境中由 wheel 安装的第三方包用于验证 conda 对“非 conda 原生安装的 Python 发行包”元数据的读取与识别能力。与DESCRIPTION.rst同目录的还有METADATA、WHEEL、RECORD、INSTALLER、top_level.txt、metadata.json等文件共同构成一个标准 wheel 的dist-info元数据目录。conda 正是依据这些文件来判断环境中安装了哪些 Python 包并据此提供环境信息查询、克隆加速等能力。二、文档正文核心内容service_identity 的用途与技术定位2.1 适用场景DESCRIPTION.rst明确指出这个包适用于两类场景你使用pyOpenSSL且不希望被中间人攻击MITM所欺骗你需要验证某个PyCA cryptography证书是否对特定主机名有效。它的目标是“提供验证证书是否符合预期用途所需的全部工具”其中最基本的场景就是主机名校验host name verification。这是 TLS 安全模型中的关键一环仅仅验证证书由可信 CA 签发还不够还必须确认证书确实签发给当前正在访问的域名否则攻击者可以出示一张针对其他域名的合法证书来实施中间人攻击。2.2 标准依据完整实现 RFC 6125service_identity完整实现了RFC 6125“Representation and Verification of Domain-Based Application Service Identity within Internet Public Key Infrastructure Using X.509 (PKIX) Certificates in the Context of Transport Layer Security (TLS)”并计划在后续版本中追加其他相关 RFC。RFC 6125 的核心贡献在于统一了“应用服务身份校验”的规则当客户端与服务器建立 TLS 连接时客户端需要将期望访问的服务身份如 DNS 主机名与服务器证书中携带的身份信息进行比对。比对信息来源包括证书的subjectAltNameSAN 扩展以及历史遗留的Common NameCN字段。2.3 通配符Wildcard规则文档特别强调了一项与主流浏览器行为一致的安全策略通配符*只允许出现在证书名称的最左侧标签中。也就是说形如*.example.com的证书是合法的它只能匹配www.example.com、api.example.com等同一域名层级下的主机而不能匹配example.com本身更不能出现www.*.com这种中间通配形式。这一规则是 Chrome 58、Firefox 48 等现代浏览器长期采用的做法service_identity在 17.0.0 版本中将其收紧落地。三、17.0.0 版本要点从文档 changelog 看安全演进DESCRIPTION.rst中内嵌了该版本完整的 Release Information包含两项关键的安全相关变更3.1 Common NameCN正式进入弃用通道由于 Chrome 58 与 Firefox 48 均不再接受“仅包含 Common Name、没有 SAN 扩展”的证书service_identity自 16.0.0 起便对 CN 的使用发出告警17.0.0 延续这一策略并计划在 2018 年年中彻底移除对 CN 的支持。对开发者的启示为站点签发证书时应始终确保证书包含subjectAltName扩展仅依赖 CN 的旧式证书在主流浏览器与严格校验库如service_identity中都会逐渐失效。3.2 行为改进SubjectAltNameWarning附带 Common Name当抛出service_identity.SubjectAltNameWarning时警告信息中现在会包含证书的 Common NamePR #17便于开发者快速定位是哪个 CN 与 SAN 不一致。新增cryptography.x509后端除了基于 pyOpenSSL 的校验实现外17.0.0 增加了基于 PyCAcryptography.x509的验证后端PR #18丰富了底层 X.509 解析与校验的依赖选择。收紧通配符匹配规则*仅允许位于最左侧标签PR #19与主流浏览器行为保持一致。这些细节说明service_identity的版本演进紧密跟随浏览器生态与 TLS 最佳实践的变化——这也正是 conda 将完整描述文件保留在测试夹具中的价值它代表了真实世界里持续演进的第三方 Python 包元数据形态。四、元数据文件的仓库角色conda 如何解析这份 wheel 元数据在 conda 仓库中这套数据由conda/plugins/prefix_data_loaders/pypi/pkg_format.py中定义的PythonDistributionMetadata类负责解析。该类的作用是“根据锚点文件anchor file或目录路径解析出 Python 发行包的元数据”其头部注释明确列出了所支持的元数据规范Metadata 1.0PEP 241、1.1PEP 314、1.2PEP 345以及 2.1PEP 566——这些规范对应的样例数据同样位于tests/data/env_metadata/目录下。4.1 文件发现策略_process_pathPythonDistributionMetadata._process_path实现了元数据文件的定位逻辑传入路径为目录时依次在目录内查找FILE_NAMES中定义的(METADATA, PKG-INFO)两个候选文件名命中第一个存在的文件即作为元数据源传入路径为文件时要求路径以.egg-info或以METADATA/PKG-INFO结尾否则抛出RuntimeError路径不存在或为空时发出MetadataWarning告警并返回None。对于service_identity-17.0.0.dist-info而言conda 会优先命中其中的METADATA文件。这正是本次分析的DESCRIPTION.rst的“宿主”——在 wheel 打包过程中DESCRIPTION.rst的内容会被嵌入METADATA的正文部分二者内容完全一致读者可对照tests/data/env_metadata/py36-osx-whl/lib/python3.6/site-packages/service_identity-17.0.0.dist-info/METADATA验证。4.2 头部解析_read_metadata与_message_to_dict元数据文件采用 RFC 822 风格的头字段格式。_read_metadata使用email.parser.HeaderParser解析文件_message_to_dict再按规范将其转换为字典命中MULTIPLE_USE_KEYS如Requires-Dist、Requires-Python、Provides-Extra、Requires的字段聚合成列表命中SINGLE_USE_KEYS如Metadata-Version、Name、Version、License的字段保留单值键名统一转为小写并将连字符替换为下划线例如Requires-Dist→requires_dist。在service_identity的METADATA中这些字段的真实样例包括Metadata-Version: 2.0 Name: service-identity Version: 17.0.0 Requires-Dist: attrs Requires-Dist: pyasn1 Requires-Dist: pyasn1-modules Requires-Dist: pyopenssl (0.12) Provides-Extra: idna Requires-Dist: idna; extra idna从中可以读出该包的三层依赖结构核心依赖attrs、pyasn1、pyasn1-modules、pyopenssl (0.12)以及一个可选特性idna通过Provides-Extra 带环境标记的Requires-Dist: idna; extra idna声明。conda 的get_dist_requirements()方法会优先取requires_dist字段空时才回退到旧式requires并将结果以frozenset形式返回从而为依赖分析与环境克隆提供数据基础。4.3 从元数据到 Python 发行包PythonDistribution家族pkg_format.py依据安装方式将 Python 发行包分为几类各自以不同的锚点文件定位元数据PythonInstalledDistribution经由pipwheel安装的发行包锚点为site-packages下的*.dist-info目录MANIFEST_FILES (RECORD,)、MANDATORY_FILES (METADATA,)PythonEggInfoDistribution经setuptools以 egg 形式安装锚点为*.egg-info目录PythonEggLinkDistribution通过easy-install.pth或 egg-link 引用的可编辑安装锚点解析由get_dist_file_from_egg_link完成。service_identity-17.0.0正是第一种形态——由 wheel 安装的PythonInstalledDistribution。其dist-info目录内的WHEEL文件Wheel-Version: 1.0、Root-Is-Purelib: true、Tag: py2-none-any、Tag: py3-none-any表明这是一个纯 Python、跨平台、同时兼容 Python 2/3 的通用 wheel与METADATA中的Platform: UNKNOWN及“MacOS / Windows / Linux / BSD”等多平台Classifier相互印证。五、测试如何验证这套解析逻辑仓库中与这套 fixture 直接对应的测试位于 tests/common/pkg_formats/test_python.pyENV_METADATA_DIR指向tests/data/env_metadata所有环境元数据夹具都从这里读取test_metadata_process_path验证_process_path对“目录/文件/空文件列表/文件顺序”四种输入的定位行为test_metadata_read_metadata验证未知键被忽略、已知键如Name: spam被正确提取、不存在的文件返回空字典test_metadata以 PEP 241/314/345/566 四套规范样例为参数化输入断言name、version、get_dist_requirements()、get_python_requirements()、get_external_requirements()、get_extra_provides()等接口的输出。除pkg_format外tests/gateways/disk/test_read.py与tests/core/test_prefix_data.py也以ENV_METADATA_DIR为数据源用于验证磁盘读取层与前缀数据层对真实环境目录含py36-osx-whl这类 wheel 安装环境的遍历与识别能力。这意味着service_identity这份描述文件不仅是一段文本更是 conda 全链路磁盘读取 → 前缀数据 → Python 发行包识别测试中的一环。六、给开发者的实践要点理解 wheel 元数据目录*.dist-info中的METADATA是机器可读的核心RFC 822 头 正文描述DESCRIPTION.rst是其正文的独立副本WHEEL描述构建形态RECORD记录安装文件清单top_level.txt声明顶层模块INSTALLER标记安装工具。主机名校验的工程底线正如service_identity文档所示TLS 客户端必须将“证书链校验”与“主机名比对”视为两件不可偏废的事SAN 缺失或仅含 CN 的证书应被拒绝通配符仅限最左侧标签。利用 conda 的元数据能力conda 通过pkg_format.py将 pip 安装的包解析为等价的 conda 记录名称经pypi_name_to_conda_name规范化、版本经norm_package_version规范化从而在混合使用 conda 与 pip 的环境中仍能获得完整、一致的环境视图——这也是tests/data/env_metadata系列夹具存在的根本原因。七、结语一份看似不起眼的DESCRIPTION.rst既是service_identity面向 TLS 开发者的技术说明书完整描述了主机名校验、RFC 6125、通配符规则与 CN 弃用路线又是 conda 解析 PyPI wheel 元数据能力的真实样本。通过阅读其METADATA、WHEEL与RECORD等配套文件对照 pkg_format.py 的PythonDistributionMetadata与PythonInstalledDistribution实现以及 test_python.py 中的参数化测试读者可以从“文件内容”和“解析实现”两个维度完整理解现代 Python 包元数据如何被组织又被 conda 如何消费。【免费下载链接】condaA system-level, binary package and environment manager running on all major operating systems and platforms.项目地址: https://gitcode.com/GitHub_Trending/co/conda创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表