Rust版本管理工具next_version的使用:自动化语义化版本控制和发布流程
Rust版本管理工具next_version的使用:自动化语义化版本控制和发布流程
概述
next_version是一个Rust库,用于基于conventional commits计算下一个语义化版本。它不会分析git历史,用户需要自己提供commit列表。
安装
在项目目录中运行以下Cargo命令:
cargo add next_version
或者在Cargo.toml中添加以下行:
next_version = "0.2.24"
示例使用
以下是使用next_version的完整示例:
use next_version::NextVersion;
use semver::Version;
fn main() {
// 当前版本
let current_version = Version::new(1, 0, 0);
// 模拟一些遵循conventional commits规范的提交消息
let commits = vec![
"feat: add new API endpoint", // 特性提交 - 触发minor版本升级
"fix: resolve memory leak", // 修复提交 - 触发patch版本升级
"chore: update dependencies", // 维护提交 - 不影响版本
"feat!: breaking change" // 破坏性变更 - 触发major版本升级
];
// 计算下一个版本
let next_version = current_version.next(commits);
println!("当前版本: {}", current_version);
println!("下一个版本: {}", next_version);
}
这个示例会输出:
当前版本: 1.0.0
下一个版本: 2.0.0
工作原理
next_version分析提供的提交消息,根据以下规则确定版本升级类型:
feat:
- 触发minor版本升级fix:
- 触发patch版本升级feat!:
或其他包含破坏性变更的提交 - 触发major版本升级chore:
,docs:
等 - 不影响版本号
高级用法
你还可以自定义配置:
use next_version::{NextVersion, VersionIncrement};
fn main() {
let current_version = Version::new(0, 5, 2);
let commits = vec![
"perf: improve rendering speed",
"docs: update README"
];
// 自定义规则:将perf提交视为特性
let next_version = current_version.next_with_options(
commits,
|commit| {
if commit.starts_with("perf:") {
Some(VersionIncrement::Minor)
} else {
None
}
}
);
println!("下一个版本: {}", next_version); // 0.6.0
}
完整示例demo
下面是一个更完整的示例,展示如何在实际项目中使用next_version:
use next_version::{NextVersion, VersionIncrement};
use semver::Version;
fn main() {
// 当前版本
let current_version = Version::new(0, 1, 0);
// 从git日志中获取的实际提交消息
let commits = vec![
"feat: implement user authentication",
"fix: correct login validation",
"docs: update API documentation",
"refactor: improve code structure",
"feat!: change authentication method",
"perf: optimize database queries"
];
// 标准计算方式
let next_standard = current_version.next(commits.clone());
// 自定义计算方式 - 将perf视为minor更新
let next_custom = current_version.next_with_options(
commits,
|commit| {
if commit.starts_with("perf:") {
Some(VersionIncrement::Minor)
} else if commit.starts_with("refactor:") {
Some(VersionIncrement::Patch)
} else {
None
}
}
);
println!("当前版本: {}", current_version);
println!("标准计算的下一个版本: {}", next_standard);
println!("自定义计算的下一个版本: {}", next_custom);
}
示例输出:
当前版本: 0.1.0
标准计算的下一个版本: 1.0.0
自定义计算的下一个版本: 1.0.0
许可证
next_version采用MIT或Apache-2.0双重许可。
1 回复
Rust版本管理工具next_version的使用指南
next_version
是一个用于自动化语义化版本控制和发布流程的Rust工具,它可以帮助开发者根据Git提交历史自动确定下一个合适的版本号。
安装
cargo install next_version
基本使用
确定下一个版本号
next_version
这会基于你的Git提交历史自动计算下一个语义化版本号。
主要功能
-
自动版本号递增:
- 根据提交信息中的关键词自动决定是主版本(major)、次版本(minor)还是修订版本(patch)
- 例如提交信息包含"BREAKING CHANGE"会触发主版本升级
-
自定义配置:
- 可以通过配置文件自定义版本规则
-
集成发布流程:
- 可以与CI/CD流程集成
示例
基本示例
$ next_version
0.1.1
查看版本变更原因
$ next_version --verbose
Found 3 commits since tag v0.1.0
Commit 1: fix: resolve issue with login
Commit 2: feat: add user profile page
Commit 3: docs: update README
Suggested version: 0.2.0 (minor bump)
Reason: feat commit detected
在CI中使用
#!/bin/bash
CURRENT_VERSION=$(git describe --tags --abbrev=0)
NEXT_VERSION=$(next_version)
if [ "$CURRENT_VERSION" != "$NEXT_VERSION" ]; then
git tag -a "v$NEXT_VERSION" -m "Release v$NEXT_VERSION"
git push origin "v$NEXT_VERSION"
fi
提交信息规范
next_version
遵循常规提交规范(Conventional Commits):
fix:
- 触发patch版本升级feat:
- 触发minor版本升级BREAKING CHANGE:
- 触发major版本升级
高级配置
创建.next-version.json
文件来自定义行为:
{
"major_keywords": ["BREAKING CHANGE"],
"minor_keywords": ["feat"],
"patch_keywords": ["fix", "perf"],
"ignore_keywords": ["docs", "style", "refactor", "test", "chore"]
}
与其他工具集成
可以与cargo-release
等工具一起使用:
next_version | xargs cargo release --execute
完整示例
以下是一个完整的项目发布流程示例:
- 首先安装工具:
cargo install next_version
cargo install cargo-release
- 创建自定义配置文件
.next-version.json
:
{
"major_keywords": ["BREAKING CHANGE", "major"],
"minor_keywords": ["feat", "feature"],
"patch_keywords": ["fix", "bugfix", "perf"],
"ignore_keywords": ["docs", "style", "refactor"]
}
- 创建发布脚本
release.sh
:
#!/bin/bash
# 获取当前版本
CURRENT_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0")
# 计算下一个版本
NEXT_VERSION=$(next_version --verbose)
echo "Current version: $CURRENT_TAG"
echo "Next version: $NEXT_VERSION"
# 检查是否需要创建新版本
if [ "v$NEXT_VERSION" != "$CURRENT_TAG" ]; then
# 更新Cargo.toml版本
cargo release "$NEXT_VERSION" --execute
# 创建Git标签
git tag -a "v$NEXT_VERSION" -m "Release v$NEXT_VERSION"
git push origin "v$NEXT_VERSION"
echo "Successfully released v$NEXT_VERSION"
else
echo "No version bump needed"
fi
- 提交信息示例:
git commit -m "feat: add user authentication"
git commit -m "fix: resolve login timeout issue"
git commit -m "BREAKING CHANGE: change API response format"
- 运行发布流程:
chmod +x release.sh
./release.sh
next_version
简化了版本管理流程,特别适合遵循语义化版本规范的项目,减少了手动确定版本号的工作量和错误可能性。