|
| 1 | +# UV 迁移检查清单 |
| 2 | + |
| 3 | +> **迁移日期**: 2026-01-18 |
| 4 | +> **迁移类型**: 渐进式迁移(pip → uv) |
| 5 | +> **项目**: GLM-ASR-WebUI |
| 6 | +
|
| 7 | +--- |
| 8 | + |
| 9 | +## ✅ 阶段 1:基础配置 |
| 10 | + |
| 11 | +### pyproject.toml 创建 |
| 12 | + |
| 13 | +- [x] 创建 `pyproject.toml` 文件 |
| 14 | +- [x] 配置 `build-system`(hatchling) |
| 15 | +- [x] 添加项目元数据(name, version, description) |
| 16 | +- [x] 配置 `dependencies`(从 requirements.txt 迁移) |
| 17 | +- [x] 配置 `dev-dependencies`(开发依赖) |
| 18 | +- [x] 配置工具设置(pytest, ruff, coverage) |
| 19 | +- [x] 设置 `allow-direct-references = true`(支持 git+https 依赖) |
| 20 | + |
| 21 | +**关键依赖**: |
| 22 | +```toml |
| 23 | +torch>=2.9.1 |
| 24 | +torchaudio>=2.9.1 |
| 25 | +transformers @ git+https://github.com/huggingface/transformers.git |
| 26 | +fastapi>=0.100.0 |
| 27 | +uvicorn[standard]>=0.30.0 |
| 28 | +``` |
| 29 | + |
| 30 | +### UV 初始化 |
| 31 | + |
| 32 | +- [x] 运行 `uv sync` 同步依赖 |
| 33 | +- [x] 生成 `uv.lock` 锁文件 |
| 34 | +- [x] 创建 `.venv` 虚拟环境 |
| 35 | +- [x] 验证依赖安装成功 |
| 36 | + |
| 37 | +### requirements.txt 同步 |
| 38 | + |
| 39 | +- [x] 创建 `scripts/export-requirements.sh` |
| 40 | +- [x] 运行 `uv pip compile pyproject.toml -o requirements.txt` |
| 41 | +- [x] 验证 requirements.txt 与 pyproject.toml 一致 |
| 42 | + |
| 43 | +--- |
| 44 | + |
| 45 | +## ✅ 阶段 2:项目结构重构 |
| 46 | + |
| 47 | +### src 布局创建 |
| 48 | + |
| 49 | +- [x] 创建 `src/glm_asr/` 目录 |
| 50 | +- [x] 创建 `src/glm_asr/__init__.py` |
| 51 | +- [x] 创建 `src/glm_asr/models.py`(Pydantic 模型) |
| 52 | +- [x] 创建 `src/glm_asr/services/asr.py`(ASR 服务) |
| 53 | +- [x] 创建 `src/glm_asr/utils/audio.py`(音频工具) |
| 54 | + |
| 55 | +### 代码模块化 |
| 56 | + |
| 57 | +**models.py** - 数据模型: |
| 58 | +- [x] `TranscriptionResponse` |
| 59 | +- [x] `HealthResponse` |
| 60 | +- [x] `ModelInfoResponse` |
| 61 | +- [x] `ServiceInfoResponse` |
| 62 | + |
| 63 | +**services/asr.py** - ASR 服务: |
| 64 | +- [x] `load_model()` - 模型加载 |
| 65 | +- [x] `transcribe_chunk()` - 音频转录 |
| 66 | +- [x] 全局配置:DEVICE, MODEL_ID |
| 67 | + |
| 68 | +**utils/audio.py** - 音频处理: |
| 69 | +- [x] `get_audio_duration()` - 获取时长 |
| 70 | +- [x] `get_audio_duration_ffmpeg()` - FFmpeg 时长 |
| 71 | +- [x] `split_audio()` - 音频分割 |
| 72 | + |
| 73 | +### 主应用重构 |
| 74 | + |
| 75 | +- [x] 移动 `app.py` → `src/glm_asr/app.py` |
| 76 | +- [x] 更新导入路径(使用新的模块结构) |
| 77 | +- [x] 配置 `PROJECT_ROOT` 路径计算 |
| 78 | +- [x] 配置 Jinja2 模板路径 |
| 79 | +- [x] 删除根目录旧的 `app.py` |
| 80 | + |
| 81 | +--- |
| 82 | + |
| 83 | +## ✅ 阶段 3:开发工具链 |
| 84 | + |
| 85 | +### 测试配置 |
| 86 | + |
| 87 | +- [x] 创建 `tests/` 目录 |
| 88 | +- [x] 创建 `tests/__init__.py` |
| 89 | +- [x] 创建 `tests/conftest.py`(pytest fixtures) |
| 90 | +- [x] 创建 `tests/test_api.py`(API 测试) |
| 91 | +- [x] 创建 `tests/test_asr_service.py`(服务测试) |
| 92 | +- [x] 配置 `[tool.pytest.ini_options]`(pytest 设置) |
| 93 | + |
| 94 | +**测试覆盖**: |
| 95 | +- [x] 根路径测试 |
| 96 | +- [x] 健康检查测试 |
| 97 | +- [x] API 信息测试 |
| 98 | +- [x] 模型信息测试 |
| 99 | +- [x] ASR 服务配置测试 |
| 100 | + |
| 101 | +### 代码质量工具 |
| 102 | + |
| 103 | +**Ruff 配置** (`[tool.ruff]`): |
| 104 | +- [x] 行长度:100 |
| 105 | +- [x] 目标 Python 版本:py312 |
| 106 | +- [x] 启用规则:F, E, W, I, N, UP, B, C4, DTZ, T10, EM, ISC, ICN, G, PIE, PYI, RSE, RET, SIM, TID, TCH, ARG, PTH, PL, TRY, NPY, RUF |
| 107 | +- [x] 忽略:E501(行长度由 formatter 处理) |
| 108 | + |
| 109 | +**Ruff Format**: |
| 110 | +- [x] 配置 `[tool.ruff.format]` |
| 111 | +- [x] 设置 `quote-style = "double"` |
| 112 | +- [x] 设置 `indent-style = "space"` |
| 113 | + |
| 114 | +### Pre-commit 钩子 |
| 115 | + |
| 116 | +- [x] 创建 `.pre-commit-config.yaml` |
| 117 | +- [x] 配置 ruff(自动修复) |
| 118 | +- [x] 配置 ruff-format |
| 119 | +- [x] 配置 pre-commit-hooks(trailing-whitespace, end-of-file-fixer, yaml, toml, merge-conflict, debug-statements) |
| 120 | +- [x] 配置 pytest(自动运行测试) |
| 121 | + |
| 122 | +### 文档更新 |
| 123 | + |
| 124 | +- [x] 更新 `README.md` |
| 125 | + - [x] 添加 uv 安装说明 |
| 126 | + - [x] 更新启动命令(`glm_asr.app:app`) |
| 127 | + - [x] 添加 uv 和 pip 两种安装方式 |
| 128 | + |
| 129 | +--- |
| 130 | + |
| 131 | +## ✅ 阶段 4:验证与清理 |
| 132 | + |
| 133 | +### 功能验证 |
| 134 | + |
| 135 | +- [x] 运行所有测试:`uv run pytest tests/ -v --cov` |
| 136 | +- [x] 运行 pre-commit:`uv run pre-commit run --all-files` |
| 137 | +- [x] 测试应用启动:`uv run uvicorn glm_asr.app:app` |
| 138 | +- [x] 测试 API 端点:`/health`, `/api/info` |
| 139 | + |
| 140 | +### 代码质量验证 |
| 141 | + |
| 142 | +- [x] 所有测试通过(7/7) |
| 143 | +- [x] Pre-commit 检查通过(自动修复 23 个问题) |
| 144 | +- [x] 代码格式化完成(8 个文件) |
| 145 | + |
| 146 | +### Git 提交 |
| 147 | + |
| 148 | +- [x] 创建功能分支:`feature/uv-migration` |
| 149 | +- [x] 提交阶段 1 变更 |
| 150 | +- [x] 提交阶段 2 变更 |
| 151 | +- [x] 提交阶段 3 变更 |
| 152 | +- [x] 提交 pre-commit 修复 |
| 153 | +- [x] 合并到 main 分支 |
| 154 | +- [x] 清理功能分支和工作树 |
| 155 | + |
| 156 | +--- |
| 157 | + |
| 158 | +## 📊 迁移统计 |
| 159 | + |
| 160 | +| 指标 | 迁移前 | 迁移后 | |
| 161 | +|------|--------|--------| |
| 162 | +| 依赖管理 | requirements.txt | pyproject.toml + uv.lock | |
| 163 | +| 项目结构 | 平铺布局 | src 布局 | |
| 164 | +| 测试框架 | 无 | pytest + coverage | |
| 165 | +| 代码质量 | 无 | ruff + pre-commit | |
| 166 | +| 开发工具 | pip | uv run | |
| 167 | +| 模块数量 | 1 个文件 | 5 个模块 | |
| 168 | +| 测试数量 | 0 | 7 个测试 | |
| 169 | + |
| 170 | +--- |
| 171 | + |
| 172 | +## 🎯 后续建议 |
| 173 | + |
| 174 | +### 短期(立即) |
| 175 | + |
| 176 | +1. **安装 pre-commit**(开发者本地): |
| 177 | + ```bash |
| 178 | + pre-commit install |
| 179 | + ``` |
| 180 | + |
| 181 | +2. **验证 CUDA 环境**(如果使用 GPU): |
| 182 | + ```bash |
| 183 | + python -c "import torch; print(torch.cuda.is_available())" |
| 184 | + ``` |
| 185 | + |
| 186 | +### 中期(1-2 周) |
| 187 | + |
| 188 | +1. **增加测试覆盖率**: |
| 189 | + - 当前 34%,目标 80%+ |
| 190 | + - 添加音频处理测试 |
| 191 | + - 添加流式 API 测试 |
| 192 | + |
| 193 | +2. **替换 FastAPI on_event**: |
| 194 | + - `@app.on_event("startup")` 已弃用 |
| 195 | + - 迁移到 `lifespan` 事件处理器 |
| 196 | + |
| 197 | +### 长期(1-3 月) |
| 198 | + |
| 199 | +1. **添加 CI/CD**: |
| 200 | + - GitHub Actions 自动化测试 |
| 201 | + - 自动化代码质量检查 |
| 202 | + |
| 203 | +2. **添加 Docker 支持**: |
| 204 | + - 创建 Dockerfile |
| 205 | + - 支持 Docker Compose 部署 |
| 206 | + |
| 207 | +--- |
| 208 | + |
| 209 | +## 🚀 常用命令速查 |
| 210 | + |
| 211 | +### 开发命令 |
| 212 | + |
| 213 | +```bash |
| 214 | +# 安装依赖 |
| 215 | +uv sync |
| 216 | + |
| 217 | +# 运行服务(开发模式) |
| 218 | +uv run uvicorn glm_asr.app:app --reload |
| 219 | + |
| 220 | +# 运行服务(生产模式) |
| 221 | +uv run uvicorn glm_asr.app:app --host 0.0.0.0 --port 8000 --workers 4 |
| 222 | + |
| 223 | +# 运行测试 |
| 224 | +uv run pytest tests/ -v --cov |
| 225 | + |
| 226 | +# 代码检查 |
| 227 | +uv run ruff check . |
| 228 | +uv run ruff format . |
| 229 | + |
| 230 | +# 运行 pre-commit |
| 231 | +uv run pre-commit run --all-files |
| 232 | + |
| 233 | +# 同步 requirements.txt |
| 234 | +./scripts/export-requirements.sh |
| 235 | +``` |
| 236 | + |
| 237 | +### 验证命令 |
| 238 | + |
| 239 | +```bash |
| 240 | +# 健康检查 |
| 241 | +curl http://localhost:8000/health |
| 242 | + |
| 243 | +# API 信息 |
| 244 | +curl http://localhost:8000/api/info |
| 245 | + |
| 246 | +# 模型信息 |
| 247 | +curl http://localhost:8000/api/v1/model/info |
| 248 | +``` |
| 249 | + |
| 250 | +--- |
| 251 | + |
| 252 | +## ✍️ 迁移记录 |
| 253 | + |
| 254 | +**日期**: 2026-01-18 |
| 255 | +**执行者**: Claude (subagent-driven-development) |
| 256 | +**审查方式**: 两阶段审查(规范合规 → 代码质量) |
| 257 | +**迁移模式**: 渐进式(4 个阶段) |
| 258 | + |
| 259 | +**合并记录**: |
| 260 | +- 特性分支:`feature/uv-migration` |
| 261 | +- 合并提交:`1aaabbd`(style: 通过 pre-commit 自动修复代码格式和 lint 问题) |
| 262 | + |
| 263 | +--- |
| 264 | + |
| 265 | +## ✅ 验收标准 |
| 266 | + |
| 267 | +所有验收标准已达成: |
| 268 | + |
| 269 | +- [x] pyproject.toml 配置完整 |
| 270 | +- [x] uv.lock 锁文件生成 |
| 271 | +- [x] src 布局重构完成 |
| 272 | +- [x] 代码模块化完成 |
| 273 | +- [x] 测试框架集成(pytest) |
| 274 | +- [x] 代码质量工具集成(ruff, pre-commit) |
| 275 | +- [x] requirements.txt 保持同步 |
| 276 | +- [x] 所有测试通过 |
| 277 | +- [x] 文档更新完成 |
| 278 | +- [x] 功能验证通过 |
| 279 | + |
| 280 | +**迁移状态**: ✅ 完成 |
0 commit comments