扩展库 / semver
semver
严格解析 SemVer 2.0.0 版本,比较优先级,并匹配常用依赖范围。
版本 1.0.0 · C / xlang · 无扩展库依赖
2026-10-29 修复复合范围的预发布上界与通配边界。Windows/Linux 完整门禁、C/XLang 双语范例和八条独立程序路径通过,Linux 另通过 ASan/UBSan;Windows 对固定 node-semver 7.8.5 的 738,115 组共同语义对照零差异。
快速开始
import semver
assert semver.valid("1.2.3+build-5")
assert semver.compare("1.0.0-alpha", "1.0.0") < 0
assert semver.satisfies("1.2.2", "<=1.2.3")
build 元数据不参与版本优先级。valid 要求严格格式;要显式去掉前导 v、V、= 或首尾 ASCII 空白(空格、tab、换行、回车、换页、垂直 tab)时使用 clean。
接口
| 入口 | 用途 |
|---|---|
valid / clean | 严格校验版本,或显式清理常见前缀和首尾 ASCII 空白。 |
major / minor / patch | 读取整数分量;非法输入返回 -1。 |
prerelease / build | 读取先行版本或 build 元数据;缺失及非法输入返回空字符串。 |
compare(a, b) | 返回 -1/0/1;非法版本返回 -2。 |
satisfies(version, range) | 匹配常用依赖范围;非法范围返回 false。 |
范围支持完整/部分版本、x/* 通配、比较运算符、~、^、空格交集、|| 并集及 A - B 区间。比较符与版本号间可有空格/tab,例如 >= 1.2.3 < 2.0.0;区间的 - 两侧可有多个空格/tab。区间还能与同一分支的其他条件取交集,例如 1.2.3 - 2.3.4 >=2.0.0。空范围或只含空格/tab 的范围匹配正式版本;空的 || 分支及只有运算符而无版本号的范围均属非法。需要显式通配时使用 *。prerelease 需要同一主次修订元组的显式 prerelease 比较器才会参与匹配。这是所列语法的实现,不宣称与 node-semver 的全部 API 或宽松解析模式等价。
简写上界保留预发布隔离:^1.0.0 >=2.0.0-alpha 不匹配 2.0.0-alpha,因为其上界是 <2.0.0-0;完整写法 <2.0.0 >=2.0.0-alpha 则可以匹配。部分上界 <=1.2 展开为 <1.3.0-0。全通配 <=*.* 不限制正式版本;<* 是合法空集,不会污染 <* || 1.2.3 的另一分支。* - 1.2.3、1.2.3 - * 支持开放端点。单独通配仍不准入预发布;最低正式版下界 >=0.0.0 按 node-semver 规则归一为无约束,其他正式版下界不消除。
C 端包含 extlibs/semver/semver_native.h;四个整数结果使用与 XLang int 一致的 int64_t。三个文本入口返回 XRT 堆分配的 char*:C 调用方用 xrtFree 释放,XLang 的 @owned 声明直接接管。九个 C 入口不会带出陈旧 XRT 错误;三个字符串入口分配失败返回 NULL 并保留 XERR_MEMORY,XLang 对应入口抛出 MemoryError。版本分量受非负 64 位整数限制,单个 prerelease/build 字段最长 255 字节,范围文本最长 511 字节;每个 || 分支展开后最多容纳 32 个基础比较器,^、~ 等简写可能占用两个。XLang 输入含内嵌 NUL 时按各接口的失败值返回,不会只检查前缀。
验证与边界
xl run release/extlibs/semver/examples/semver_c.c
xl run release/extlibs/semver/examples/ranges.xl
xl run release/extlibs/semver/examples/ranges_c.c
powershell -NoProfile -ExecutionPolicy Bypass -File release/extlibs/semver/test/check.ps1
bash release/extlibs/semver/test/check.sh
严格版本与范围解析在格式上限内检查 C 字符串终止符;超限输入不会继续无界扫描。C/XLang 验证了范围长度和元数据字段的恰好上限;C 范例可直接用 xl 单文件运行。三个文本入口的生成 C 直接保存字符串指针,仅扫描一次长度,不经 takeCstr 包装。2026-10-29 默认门禁补齐 9 个实际生成原型、42 组复合范围边界及范围筛选双语黄金对照;Windows 35 阶段、Linux C ASan/UBSan 与两平台八条独立程序路径全部通过。独立对照固定官方 npm 的 node-semver 7.8.5,738,115 组零差异,404 组本包专有区间交集写法跳过;普通使用和日常门禁不依赖 Node.js。验收限本包声明的 SemVer 语法、实现上限与上述平台,不扩大称为完整上游 API 认证。