18 个版本

使用旧的 Rust 2015

0.3.36 2018年4月28日
0.3.32 2018年4月15日
0.3.21 2018年3月20日
0.3.13 2018年2月17日
0.3.10 2017年12月23日

#63#版本化

Download history 62/week @ 2024-03-11 77/week @ 2024-03-18 132/week @ 2024-03-25 144/week @ 2024-04-01 51/week @ 2024-04-08 81/week @ 2024-04-15 76/week @ 2024-04-22 80/week @ 2024-04-29 72/week @ 2024-05-06 102/week @ 2024-05-13 59/week @ 2024-05-20 76/week @ 2024-05-27 58/week @ 2024-06-03 79/week @ 2024-06-10 58/week @ 2024-06-17 80/week @ 2024-06-24

276 每月下载量
27 个 crate 中使用 (通过 reproto-core)

MIT/Apache

86KB
2K SLoC

semver 分支用于 reproto

这是对 https://github.com/steveklabnik/semver 的分支。

对此进行了多项修改,包括但不限于

  • 同一 crate 中的解析。
  • 结构化错误处理。
  • 没有向后兼容模式。

lib.rs:

语义版本解析和比较。

语义版本化(见 http://semver.org/)是一组分配版本号的规则。

SemVer 概述

给定版本号 MAJOR.MINOR.PATCH,当你进行不兼容的 API 变更时,增加 MAJOR 版本;当你以向后兼容的方式添加功能时,增加 MINOR 版本;当你进行向后兼容的错误修复时,增加 PATCH 版本。

  1. MAJOR 版本
  2. MINOR 版本
  3. PATCH 版本

预发布和构建元数据标签可作为 MAJOR.MINOR.PATCH 格式的扩展。

在此文档中,任何关于“规范”的引用都指的是 SemVer 规范的 2.0 版本

SemVer 和 Rust 生态系统

Rust 本身遵循 SemVer 规范,其标准库也是如此。这两者并不相关。

Cargo,Rust 的包管理器,使用 SemVer 来确定你需要安装的包版本。

版本

在最简单的情况下,semver crate 允许你使用 parse 方法构建 Version 对象。

use reproto_semver::Version;

assert!(Version::parse("1.2.3") == Ok(Version {
   major: 1,
   minor: 2,
   patch: 3,
   pre: vec!(),
   build: vec!(),
}));

如果你有多个 Version,你可以使用常规的比较运算符来比较它们。

use reproto_semver::Version;

assert!(Version::parse("1.2.3-alpha") != Version::parse("1.2.3-beta"));
assert!(Version::parse("1.2.3-alpha2") >  Version::parse("1.2.0"));

如果你需要显式修改一个版本,SemVer 还允许你根据规范增加主版本、次要版本和补丁版本号。

请注意,为了执行此操作,你必须使用可变版本

use reproto_semver::Version;

let mut bugfix_release = Version::parse("1.0.0").unwrap();
bugfix_release.increment_patch();

assert_eq!(Ok(bugfix_release), Version::parse("1.0.1"));

当增加次要版本号时,补丁号重置为零(符合规范的第 7 节)

use reproto_semver::Version;

let mut feature_release = Version::parse("1.4.6").unwrap();
feature_release.increment_minor();

assert_eq!(Ok(feature_release), Version::parse("1.5.0"));

同样,当增加主版本号时,补丁号和次要号重置为零(符合规范的第 8 节)

use reproto_semver::Version;

let mut chrome_release = Version::parse("41.5.5377").unwrap();
chrome_release.increment_major();

assert_eq!(Ok(chrome_release), Version::parse("42.0.0"));

需求

《semver》crate 还提供了比较需求的功能,这些是比较复杂的比较。

例如,创建一个只匹配版本大于或等于 1.0.0 的需求

use reproto_semver::Version;
use reproto_semver::Range;

let r = Range::parse(">= 1.0.0").unwrap();
let v = Version::parse("1.0.0").unwrap();

assert!(r.to_string() == ">= 1.0.0".to_string());
assert!(r.matches(&v))

它还允许解析 ~x.y.z^x.y.z 需求,这些需求在 https://npmjs.net.cn/doc/misc/semver.html 中定义

波浪号需求 指定了一个带有一些更新的最小版本

~1.2.3 := >=1.2.3 <1.3.0
~1.2   := >=1.2.0 <1.3.0
~1     := >=1.0.0 <2.0.0

插入符号需求 允许对指定版本进行 SemVer 兼容的更新,0.x0.x+1 不被视为兼容,但 1.x1.x+1 是。

0.0.x 不与任何其他版本兼容。缺失的次要和补丁版本被简化为 0,但允许对该值有一定的灵活性。

^1.2.3 := >=1.2.3 <2.0.0
^0.2.3 := >=0.2.3 <0.3.0
^0.0.3 := >=0.0.3 <0.0.4
^0.0   := >=0.0.0 <0.1.0
^0     := >=0.0.0 <1.0.0

通配符需求 允许解析格式为 *x.*x.y.* 的版本需求。

*     := >=0.0.0
1.*   := >=1.0.0 <2.0.0
1.2.* := >=1.2.0 <1.3.0

依赖项

~175KB