一个主要用于解析和比较软件包版本和版本范围的通用库。是Package URLs的配套工具。
项目描述
univers: 主要通用版本和版本范围比较与转换
univers 是由于在 VulnerableCode 中需要一种主要通用的方式来存储版本范围,以及比较两个软件包版本而诞生的。
包版本范围和版本约束是有用且必要的
当将已知漏洞或错误与受影响的包版本范围相关联时。例如,一个如“漏洞 123 影响包 bar,版本 3.1 和版本 4.2,但不影响版本 5”的声明定义了受漏洞影响的 bar 版本范围。
当解析包的依赖关系以表示支持的版本子集时。例如,一个依赖关系要求声明“我需要包 foo,版本 2.0 及更高版本”定义了可接受的 foo 版本范围。
版本语法和范围表示在各个生态系统中相当不同,这使得在各个生态系统中以一致的方式处理版本和版本范围变得困难。
现有的工具和库通常支持单个算法来解析和比较版本,并为单个包生态系统提供单个版本范围表示法。
univers 是不同的
它跟踪每个生态系统版本方案以及如何比较两个版本。
它在单个库中支持不断增长的数量包生态系统版本。
它可以使用其原生表示法(例如 npm 范围)解析版本范围字符串到常见的“vers”表示法和内部对象模型,并且可以从“vers”范围重新构建原生版本范围字符串。
它被设计用于与 Package URLs (purl) 一起工作。
univers 是如何工作的?
univers 包装、嵌入和实现了多个版本比较库,每个库都专注于特定的生态系统版本方案。
对于每个方案,univers 提供了一个实现,包括
版本比较过程,例如,如何比较两个版本,
解析和从原生版本范围表示法转换为 univers 标准化和统一的内部模型,
将范围转换回其方案原生范围语法和 vers 语法。
univers 实现了 vers,一个实验性的统一和主要通用版本范围语法。它可以解析并将现有的原生版本范围字符串转换为这种统一语法。例如,这意味着
将 Python 包中使用的 “>=1.2.3” 转换为 vers:pypi/>=1.2.3,
或将 npm 包依赖声明中使用的 “^1.0.2” 转换为 vers:npm/>=1.0.2|<2.0.0
支持的包生态系统版本方案和底层库包括
npm:使用 “node-semver” 范围表示法和 semver 版本语法。这在部分上由 semantic_version 库支持。
pypi:由 Python 的打包库和标准的 packaging.version 模块处理。
使用类似semver但并非完全符合semver方案的Rubygems,并且版本段可能超过三个。Gem还使用与node-semver略有不同的范围表示法,具有不同的运算符和略微不同的语义:例如,它使用“~>”作为悲观运算符,支持使用!=进行排除,并且不支持在约束(它称为需求)之间使用“OR”。Gem由Python端口处理的Rubygems需求和版本处理代码,来自puppeteer工具
debian:由debian-inspector库处理。
maven:由内嵌的pymaven库处理。
rpm:由内嵌的rpm_vercmp库处理。
golang(使用semver)
PHP composer
ebuild/gentoo:由内嵌的gentoo_vercmp模块处理。
arch linux:由从msys2借用的内嵌arch实用模块处理。
Alpine linux:使用基于Gentoo的版本支持和针对Alpine的特定额外功能。
目前,对每个生态系统的支持水平可能并不一致,并且持续实现新的方案和对更多包类型的支持。
替代方案
而不是使用特定于生态系统的版本方案和代码,另一种方法是使用libversion中实现的单一流程来处理所有版本。libversion在大多数常见情况下都有效,但在需要精确版本比较的任务(如依赖关系解析和漏洞查找)中可能无法正确工作,因为这些任务不接受“足够好”的比较精度。libversion不处理版本范围表示法。
安装
$ pip install univers
示例
比较两个原生Python版本
from univers.versions import PypiVersion
assert PypiVersion("1.2.3") < PypiVersion("1.2.4")
从npm规范化版本范围
from univers.version_range import NpmVersionRange
range = NpmVersionRange.from_native("^1.0.2")
assert str(range) == "vers:npm/>=1.0.2|<2.0.0"
测试版本是否在版本范围内或之外
from univers.versions import PypiVersion
from univers.version_range import VersionRange
range = VersionRange.from_string("vers:pypi/>=1.2.4")
assert PypiVersion("1.2.4") in range
assert PypiVersion("1.2.3") not in range
开发
从https://github.com/aboutcode-org/univers的git克隆开始运行这些命令
$ ./configure --dev $ source venv/bin/active $ pytest -vvs
我们使用与其他AboutCode项目相同的发展过程。
访问https://github.com/aboutcode-org/univers和https://gitter.im/aboutcode-org/vulnerablecode以及https://gitter.im/aboutcode-org/aboutcode以获取支持和聊天。
主要许可证:Apache-2.0 SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause AND MIT
项目详情
下载文件
下载您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。