#semver #version #semantic #compare

forgiving-semver

语义版本解析和比较。是https://docs.rs/crate/semver的分支,支持解析语义版本规范之外的内容,例如"1.0" -> "1.0.0"。

1个不稳定版本

使用旧的Rust 2015

0.11.0 2020年12月10日

#2996解析器实现

Download history 57/week @ 2024-03-17 33/week @ 2024-03-24 58/week @ 2024-03-31 5/week @ 2024-04-07 34/week @ 2024-04-14 63/week @ 2024-04-21 51/week @ 2024-04-28 56/week @ 2024-05-05 103/week @ 2024-05-12 181/week @ 2024-05-19 78/week @ 2024-05-26 45/week @ 2024-06-02 59/week @ 2024-06-09 46/week @ 2024-06-16 32/week @ 2024-06-23 5/week @ 2024-06-30

146每月下载量

MIT/Apache

76KB
1.5K SLoC

semver

语义版本解析和比较。是semver crate的分支,增加了对semver规范之外版本解析的支持,但非常流行。

具体来说,我们扩展了父crate以支持

"x.y" => "x.y.0"
"x" => "x.0.0"

有关其他方面的更多信息,请参阅父crate。

安装

要使用forgiving_semver,将其添加到你的[dependencies]部分

forgiving_semver = "0.11.0"

lib.rs:

语义版本解析和比较。

语义版本控制(参见http://semver.org/)是一组用于分配版本号的规则。

SemVer概述

给定一个版本号MAJOR.MINOR.PATCH,增加MAJOR版本当您进行不兼容的API更改时,增加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 forgiving_semver::Version;

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

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

use forgiving_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"));

如果您明确需要修改一个Version,SemVer还允许您根据规范增加主版本、次版本和修订号。

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

use forgiving_semver::Version;

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

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

当增加次要版本号时,补丁号重置为零(根据规范第7节所述)

use forgiving_semver::Version;

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

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

同样,当增加主版本号时,补丁号和次要号都重置为零(根据规范第8节所述)

use forgiving_semver::Version;

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

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

需求

semver 包还提供了比较需求的函数,这些比较更复杂。

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

use forgiving_semver::Version;
use forgiving_semver::VersionReq;

let r = VersionReq::parse(">=1.0.0")?;
let v = Version::parse("1.0.0")?;

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

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

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

~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

依赖

~1.6–5.5MB
~104K SLoC