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));
}
}
主要功能
- 版本解析:支持解析符合语义化版本规范(SemVer)的版本号
- 版本比较:提供完整的版本比较功能,包括预发布版本的比较
- 版本需求匹配:支持npm-style的版本需求规范(如^1.2.3, ~1.2.0等)
- 高效实现:为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
缓存常见版本范围 - 实现了轻量级的比较操作
- 避免不必要的内存分配
对于高频版本比较场景,建议重用已解析的Version
和VersionReq
实例。
错误处理
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
是处理语义化版本的强大工具,特别适合需要严格版本控制的应用程序和库开发。