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提交历史自动计算下一个语义化版本号。

主要功能

  1. 自动版本号递增

    • 根据提交信息中的关键词自动决定是主版本(major)、次版本(minor)还是修订版本(patch)
    • 例如提交信息包含"BREAKING CHANGE"会触发主版本升级
  2. 自定义配置

    • 可以通过配置文件自定义版本规则
  3. 集成发布流程

    • 可以与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

完整示例

以下是一个完整的项目发布流程示例:

  1. 首先安装工具:
cargo install next_version
cargo install cargo-release
  1. 创建自定义配置文件.next-version.json
{
  "major_keywords": ["BREAKING CHANGE", "major"],
  "minor_keywords": ["feat", "feature"],
  "patch_keywords": ["fix", "bugfix", "perf"],
  "ignore_keywords": ["docs", "style", "refactor"]
}
  1. 创建发布脚本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
  1. 提交信息示例:
git commit -m "feat: add user authentication"
git commit -m "fix: resolve login timeout issue"
git commit -m "BREAKING CHANGE: change API response format"
  1. 运行发布流程:
chmod +x release.sh
./release.sh

next_version简化了版本管理流程,特别适合遵循语义化版本规范的项目,减少了手动确定版本号的工作量和错误可能性。

回到顶部