# spring-lsp 发布指南
本文档描述了 spring-lsp 项目的发布流程和相关工具。
## 🚀 快速发布
### 使用发布脚本(推荐)
```bash
# 发布补丁版本 (0.1.0 -> 0.1.1)
./scripts/release.sh patch
# 发布次要版本 (0.1.0 -> 0.2.0)
./scripts/release.sh minor
# 发布主要版本 (0.1.0 -> 1.0.0)
./scripts/release.sh major
# 发布预发布版本 (0.1.0 -> 0.2.0-alpha.1)
./scripts/release.sh prerelease alpha
```
### 使用 GitHub Actions
1. **自动版本更新**:
- 访问 [Actions 页面](https://github.com/spring-rs/spring-lsp/actions/workflows/version-bump.yml)
- 点击 "Run workflow"
- 选择版本类型(patch/minor/major/prerelease)
- 运行工作流
2. **手动发布**:
- 访问 [Actions 页面](https://github.com/spring-rs/spring-lsp/actions/workflows/release.yml)
- 点击 "Run workflow"
- 输入版本号(如 0.1.0)
- 选择是否为 dry run(测试模式)
- 运行工作流
## 📋 发布流程
### 完整发布流程
1. **准备阶段**
- 确保所有测试通过
- 更新文档和示例
- 检查代码质量(格式、Clippy)
2. **版本更新**
- 更新 `Cargo.toml` 中的版本号
- 更新 `CHANGELOG.md`
- 创建发布提交和标签
3. **自动化发布**
- GitHub Actions 自动触发
- 构建多平台二进制文件
- 发布到 crates.io
- 创建 GitHub Release
4. **发布后验证**
- 验证 crates.io 上的包
- 测试安装和基本功能
- 更新文档网站
### 版本号规则
spring-lsp 遵循 [语义化版本](https://semver.org/lang/zh-CN/) 规范:
- **主版本号**:不兼容的 API 修改
- **次版本号**:向下兼容的功能性新增
- **修订号**:向下兼容的问题修正
#### 版本示例
```
0.1.0 # 初始版本
0.1.1 # 补丁版本(Bug 修复)
0.2.0 # 次要版本(新功能)
1.0.0 # 主要版本(重大更改)
0.2.0-alpha.1 # 预发布版本
0.2.0-beta.1 # Beta 版本
0.2.0-rc.1 # Release Candidate
```
## 🛠️ 发布工具
### 1. 发布脚本 (`scripts/release.sh`)
本地发布脚本,提供完整的发布流程:
**功能:**
- 依赖检查(cargo、git、cargo-edit)
- Git 状态验证
- 代码质量检查(格式、Clippy、测试)
- 版本号更新
- CHANGELOG.md 更新
- 创建发布提交和标签
- 推送到远程仓库
**使用方法:**
```bash
# 基本用法
./scripts/release.sh <版本类型> [预发布类型]
# 示例
./scripts/release.sh patch # 补丁版本
./scripts/release.sh minor # 次要版本
./scripts/release.sh major # 主要版本
./scripts/release.sh prerelease alpha # Alpha 预发布版本
./scripts/release.sh prerelease beta # Beta 预发布版本
./scripts/release.sh prerelease rc # RC 预发布版本
```
### 2. GitHub Actions Workflows
#### 发布工作流 (`.github/workflows/release.yml`)
**触发条件:**
- 推送标签(`v*.*.*`)
- 手动触发(workflow_dispatch)
**功能:**
- 预检查(代码质量、测试)
- 版本验证
- 多平台构建(Linux、macOS、Windows)
- 发布到 crates.io
- 创建 GitHub Release
- 上传二进制文件
**支持的平台:**
- Linux x86_64 (glibc)
- Linux x86_64 (musl)
- macOS x86_64
- macOS ARM64
- Windows x86_64
#### 版本更新工作流 (`.github/workflows/version-bump.yml`)
**触发条件:**
- 手动触发(workflow_dispatch)
**功能:**
- 自动更新版本号
- 更新 CHANGELOG.md
- 创建提交和标签
- 推送到远程仓库
- 创建 Pull Request(非补丁版本)
### 3. CI 工作流 (`.github/workflows/ci.yml`)
持续集成工作流,确保代码质量:
**功能:**
- 多平台测试(Ubuntu、macOS、Windows)
- 多 Rust 版本测试(stable、beta)
- 代码格式检查
- Clippy 静态分析
- 代码覆盖率报告
## 🔧 配置要求
### GitHub Secrets
发布流程需要以下 GitHub Secrets:
1. **`CARGO_REGISTRY_TOKEN`**
- 用于发布到 crates.io
- 在 [crates.io](https://crates.io/me) 生成 API Token
- 添加到 GitHub 仓库的 Secrets
2. **`GITHUB_TOKEN`**
- 用于创建 GitHub Release
- GitHub 自动提供,无需手动配置
### 本地环境
发布脚本需要以下工具:
```bash
# 安装 Rust 和 Cargo
# 安装 cargo-edit(用于版本管理)
cargo install cargo-edit
# 确保 Git 已配置
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
```
## 📝 发布检查清单
### 发布前检查
- [ ] 所有测试通过
- [ ] 代码格式正确 (`cargo fmt`)
- [ ] Clippy 检查通过 (`cargo clippy`)
- [ ] 文档构建成功 (`cargo doc`)
- [ ] 示例代码可运行
- [ ] README.md 已更新
- [ ] CHANGELOG.md 已准备
### 发布后验证
- [ ] crates.io 上的包可正常安装
- [ ] GitHub Release 已创建
- [ ] 二进制文件可下载并运行
- [ ] 文档网站已更新
- [ ] 版本标签已推送
## 🐛 故障排除
### 常见问题
1. **发布到 crates.io 失败**
```
error: failed to publish to registry at https://crates.io/
```
- 检查 `CARGO_REGISTRY_TOKEN` 是否正确配置
- 确保版本号未被使用
- 检查包名是否可用
2. **版本号冲突**
```
error: crate version `0.1.0` is already uploaded
```
- 更新版本号到未使用的版本
- 检查 crates.io 上的现有版本
3. **构建失败**
```
error: could not compile `spring-lsp`
```
- 检查所有平台的兼容性
- 确保依赖项可用
- 检查 Rust 版本要求
4. **Git 推送失败**
```
error: failed to push some refs
```
- 确保有推送权限
- 检查分支保护规则
- 拉取最新更改
### 调试技巧
1. **使用 dry run 模式**
```bash
```
2. **本地测试构建**
```bash
cargo package --allow-dirty
cargo publish --dry-run
```
3. **检查生成的包**
```bash
cargo package --list
tar -tzf target/package/spring-lsp-*.crate
```
## 📚 相关资源
- [Cargo 发布指南](https://doc.rust-lang.org/cargo/reference/publishing.html)
- [语义化版本规范](https://semver.org/lang/zh-CN/)
- [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/)
- [GitHub Actions 文档](https://docs.github.com/en/actions)
- [crates.io 发布指南](https://doc.rust-lang.org/cargo/reference/publishing.html)
## 🤝 贡献
如果您发现发布流程中的问题或有改进建议,请:
1. 创建 Issue 描述问题
2. 提交 Pull Request 修复问题
3. 更新相关文档
---
**注意**:发布是一个重要操作,请在发布前仔细检查所有更改。建议先在测试环境中验证发布流程。