Rust语义化版本控制库deno_semver的使用,deno_semver提供高效准确的版本号解析与比较功能

Rust语义化版本控制库deno_semver的使用

deno_semver是Deno CLI中使用的语义化版本控制库,提供高效准确的版本号解析与比较功能。

安装

在项目目录中运行以下Cargo命令:

cargo add deno_semver

或者在Cargo.toml中添加:

deno_semver = "0.9.0"

基本使用示例

use deno_semver::{Version, VersionReq};

fn main() {
    // 版本号解析
    let version = Version::parse_from_npm("1.2.3-alpha.1").unwrap();
    println!("解析版本: {}", version);
    
    // 版本比较
    let v1 = Version::parse_from_npm("1.2.3").unwrap();
    let v2 = Version::parse_from_npm("1.5.0").unwrap();
    println!("比较结果: {}", v1 < v2); // true
    
    // 版本需求匹配
    let req = VersionReq::parse(">=1.2.3 <2.0.0").unwrap();
    println!("版本1.2.3是否匹配需求: {}", req.matches(&v1)); // true
    println!("版本1.5.0是否匹配需求: {}", req.matches(&v2)); // true
    println!("版本2.0.0是否匹配需求: {}", req.matches(&Version::parse_from_npm("2.0.0").unwrap())); // false
}

完整示例

use deno_semver::{Version, VersionReq};

fn main() {
    // 示例1: 基本版本解析
    let versions = ["1.2.3", "0.4.5-beta", "2.0.0-alpha.1"];
    for v_str in versions.iter() {
        let version = Version::parse_from_npm(v_str).unwrap();
        println!("解析版本 {} -> {}", v_str, version);
    }

    // 示例2: 版本比较
    let comparison_cases = [
        ("1.2.3", "1.2.3", std::cmp::Ordering::Equal),
        ("1.2.3", "1.2.4", std::cmp::Ordering::Less),
        ("1.2.3-alpha", "1.2.3", std::cmp::Ordering::Less),
        ("1.2.3-beta", "1.2.3-alpha", std::cmp::Ordering::Greater),
    ];

    for (a, b, expected) in comparison_cases.iter() {
        let a_ver = Version::parse_from_npm(a).unwrap();
        let b_ver = Version::parse_from_npm(b).unwrap();
        let result = a_ver.cmp(&b_ver);
        println!("比较 {} 和 {}: {:?} (预期: {:?})", a, b, result, expected);
    }

    // 示例3: 版本需求匹配
    let req = VersionReq::parse("^1.2.3").unwrap();
    let test_versions = ["1.2.3", "1.5.0", "2.0.0", "1.2.2"];
    
    for v_str in test_versions.iter() {
        let version = Version::parse_from_npm(v_str).unwrap();
        println!("版本 {} 是否匹配需求 {}: {}", v_str, req, req.matches(&version));
    }
}

主要功能

  1. 版本解析:支持解析符合语义化版本规范(SemVer)的版本号
  2. 版本比较:提供完整的版本比较功能,包括预发布版本的比较
  3. 版本需求匹配:支持npm-style的版本需求规范(如^1.2.3, ~1.2.0等)
  4. 高效实现:为Deno CLI优化的高性能实现

deno_semver是一个专门为Deno生态系统设计的语义化版本库,但也可以用于任何Rust项目中需要版本控制的功能。


1 回复

Rust语义化版本控制库deno_semver使用指南

deno_semver是一个用于解析和比较语义化版本(SemVer)的Rust库,它提供了高效准确的版本号处理功能。

基本功能

安装

在Cargo.toml中添加依赖:

[dependencies]
deno_semver = "0.2"

解析版本号

use deno_semver::Version;

let version = Version::parse("1.2.3-alpha.1+build.123").unwrap();

assert_eq!(version.major, 1);
assert_eq!(version.minor, 2);
assert_eq!(version.patch, 3);
assert_eq!(version.pre, vec!["alpha", "1"]);
assert_eq!(version.build, vec!["build", "123"]);

版本比较

use deno_semver::Version;

let v1 = Version::parse("1.2.3").unwrap();
let v2 = Version::parse("1.2.4").unwrap();

assert!(v1 < v2);
assert!(v1 != v2);

高级用法

版本范围匹配

use deno_semver::{Version, VersionReq};

let req = VersionReq::parse(">=1.2.3, <2.0.0").unwrap();
let version = Version::parse("1.5.0").unwrap();

assert!(req.matches(&version));

通配符版本

use deno_semver::{Version, VersionReq};

let req = VersionReq::parse("1.*").unwrap();
let version = Version::parse("1.5.0").unwrap();

assert!(req.matches(&version));

预发布版本处理

use deno_semver::{Version, VersionReq};

let req = VersionReq::parse("^1.2.3").unwrap();
let stable = Version::parse("1.2.4").unwrap();
let prerelease = Version::parse("1.2.4-alpha.1").unwrap();

assert!(req.matches(&stable));
assert!(!req.matches(&prerelease)); // 默认不匹配预发布版本

// 允许预发布版本匹配
let req_with_pre = VersionReq::parse("^1.2.3-0").unwrap();
assert!(req_with_pre.matches(&prerelease));

实用功能

版本号规范化

use deno_semver::Version;

let mut version = Version::parse("1.2.3-alpha.1+build.123").unwrap();
version.build = vec![]; // 移除build元数据
version.pre = vec![];   // 移除预发布标签

assert_eq!(version.to_string(), "1.2.3");

自定义比较

use deno_semver::Version;

let v1 = Version::parse("1.2.3").unwrap();
let v2 = Version::parse("1.2.3+build.456").unwrap();

// 忽略build元数据比较
assert!(v1 == v2);

性能提示

deno_semver在解析版本时进行了优化:

  • 使用&'static str缓存常见版本范围
  • 实现了轻量级的比较操作
  • 避免不必要的内存分配

对于高频版本比较场景,建议重用已解析的VersionVersionReq实例。

错误处理

use deno_semver::{Version, VersionReq};

// 解析错误处理
let result = Version::parse("invalid.version");
assert!(result.is_err());

// 范围解析错误
let req_result = VersionReq::parse(">1.2.3 <2.0.0"); // 缺少逗号
assert!(req_result.is_err());

完整示例Demo

use deno_semver::{Version, VersionReq};

fn main() {
    // 示例1: 解析和显示版本信息
    let version_str = "2.5.8-beta.2+sha.1234abcd";
    let version = Version::parse(version_str).expect("无效的版本格式");
    
    println!("解析版本: {}", version_str);
    println!("主版本号: {}", version.major);
    println!("次版本号: {}", version.minor);
    println!("修订号: {}", version.patch);
    println!("预发布标签: {:?}", version.pre);
    println!("构建元数据: {:?}\n", version.build);

    // 示例2: 版本比较
    let stable_v1 = Version::parse("1.0.0").unwrap();
    let stable_v2 = Version::parse("1.0.1").unwrap();
    let pre_release = Version::parse("1.0.0-rc.1").unwrap();
    
    println!("比较结果:");
    println!("1.0.0 < 1.0.1: {}", stable_v1 < stable_v2);
    println!("1.0.0 == 1.0.0-rc.1: {}", stable_v1 == pre_release);
    println!("1.0.0-rc.1 < 1.0.0: {}\n", pre_release < stable_v1);

    // 示例3: 版本范围匹配
    let range = VersionReq::parse(">=1.2.0, <2.0.0").unwrap();
    let versions = vec![
        Version::parse("1.1.9").unwrap(),
        Version::parse("1.2.0").unwrap(),
        Version::parse("1.9.9").unwrap(),
        Version::parse("2.0.0").unwrap(),
    ];
    
    println!("版本范围匹配 (>=1.2.0, <2.0.0):");
    for v in versions {
        println!("{} 匹配: {}", v, range.matches(&v));
    }
    println!();

    // 示例4: 处理预发布版本
    let standard_range = VersionReq::parse("^1.0.0").unwrap();
    let pre_range = VersionReq::parse("^1.0.0-0").unwrap();
    let pre_version = Version::parse("1.0.0-beta.2").unwrap();
    
    println!("预发布版本处理:");
    println!("标准范围匹配预发布: {}", standard_range.matches(&pre_version));
    println!("允许预发布的范围匹配: {}", pre_range.matches(&pre_version));

    // 示例5: 错误处理
    match Version::parse("not.a.version") {
        Ok(v) => println!("解析成功: {}", v),
        Err(e) => println!("解析错误: {}", e),
    }
}

deno_semver是处理语义化版本的强大工具,特别适合需要严格版本控制的应用程序和库开发。

回到顶部