Litefs 版本演进路线(0.10.0 → 1.0.0)
定位:生产就绪 —— API 稳定承诺 + 质量硬指标达标 基线版本:v0.9.0(
cb2988f) 编制日期:2026-10-21 对标对象:Starlette(近 8 年唯一真正走完 0.x → 1.0 的同代 ASGI 框架) 核心原则:硬性标准未全部达成,不升 v1.0
一、路线调整说明(决策变更记录)
1.1 变更内容
项 |
原方案(2026-10-21 初版) |
现方案(本版) |
|---|---|---|
交付形态 |
v1.0.0 一次性执行 P0–P3 全部内容 |
拆分为 6 个 0.x.x 版本,逐版交付可发布成果 |
破坏性变更 |
集中在 v1.0.0 一次性执行(B1–B8) |
分散到各 0.x 版本,利用 SemVer 0.x 允许破坏的特性 |
v1.0.0 性质 |
「大量变更的交付版本」 |
「稳定性声明版本」 —— 几乎零代码变更,只做 API 冻结宣告 + 政策定稿 + 标签 |
晋级条件 |
一次性满足 15 条 DoD |
每一版 0.x 都是可发布版本;15 条 DoD 全部达成才允许打 v1.0.0 标签 |
发布粒度 |
1 次大版本 |
7 次发布(0.10.0 – 0.15.0 + 1.0.0),每次均含 CHANGELOG 与 Release Notes |
变更理由:行业数据显示 0.x → 1.0 的中位耗时是 3–8 年(Starlette 7.8 年,Flask 约 8 年,FastAPI 8 年仍未达成 1.0)。把 3–8 年的工程量压进单次发布,风险不可控且无法持续验证。分版本路线让每一批改动都被真实用户验证过 —— 1.0 应该是「验证完毕的既有事实」,而不是「一次性押注的未来承诺」。
1.2 SemVer 0.x 下的破坏性变更处理
SemVer 规范中 0.y.z 阶段「任何变更都可能发生」,因此:
0.x 阶段:
0.MINOR位递增即视为破坏性版本(Django 1.0 前、Flask 1.0 前均遵循此惯例)。跨0.MINOR边界的破坏性变更无需弃用期,但必须在 CHANGELOG 单列Changed/Removed专章。1.0 之后:破坏性变更只走 major,且弃用项须在移除前保留至少 2 个 feature release(对标 Django)。
0.x 阶段的过渡期保护:对用户可见的公共 API(
litefs.__all__中的 stable 分级符号),即使在 0.x 阶段也须至少保留 1 个 minor 版本的DeprecationWarning过渡;纯内部重构(_前缀符号)不受此约束。
1.3 与既有决策的关系
决策「范围定位 = 聚焦稳定性硬指标」保持不变。
决策「Python 基线 = 3.10–3.14」保持不变,落地于 v0.14.0。
决策「ASGI 深度 = 渐进增强」保持不变,落地于 v0.13.0。
原决策「破坏性变更 = 1.0.0 一次性执行」被本方案覆盖,改为分散执行。
二、为什么是现在,以及对标谁
2.1 行业 1.0 的现实参照
框架 |
当前稳定版 |
是否到 1.0 |
1.0 首发 |
0.x → 1.0 耗时 |
Python 要求 |
|---|---|---|---|---|---|
Starlette |
1.9.0 |
✅ |
2026-03-22 |
约 7.8 年 |
>=3.11 |
FastAPI |
0.156.6 |
❌ 至今 0.x |
— |
8 年未达成 |
>=3.10 |
Django |
6.1.2 |
✅ |
2008-09-04 |
约 2.7 年 |
>=3.12 |
Flask |
3.1.3 |
✅ |
2018-04-26 |
约 8 年 |
>=3.9 |
Tornado |
6.5.10 |
✅ |
2010-07-23 |
约 2 个月 |
>=3.9 |
Sanic |
25.12.1 |
❌ 跳过 1.x |
— |
— |
>=3.10 |
Litestar |
2.25.0 |
❌ 跳过 1.x |
— |
— |
>=3.8 |
aiohttp |
3.14.5 |
❌ 仍 3.x |
— |
— |
>=3.10 |
Quart |
0.23.1 |
❌ 仍 0.x |
— |
— |
>=3.13 |
结论:0.x → 1.0 的中位耗时是 3–8 年。 FastAPI 用了 8 年仍未发布 1.0,是最值得警惕的样本 —— 它的问题不是功能不足,而是始终没有对 API 稳定性做出可依赖的承诺。
因此 Litefs 的 1.0 不以功能数量取胜,而以「承诺的可信度」取胜:对标 Starlette 1.0 的做法,而不是对标 FastAPI 的功能面。
2.2 业界公认的「可以叫 1.0」判据(按重要性排序)
# |
判据 |
行业实践 |
Litefs 现状 |
交付版本 |
|---|---|---|---|---|
1 |
成文的 API 稳定性承诺 + 严格 SemVer |
Django《API stability》指南、Starlette 1.0 博客「We'll follow SemVer strictly」 |
❌ 无 |
v0.10.0 |
2 |
长弃用期,破坏性变更只走 major |
Django:弃用后至少保留 2 个 feature release |
❌ 无弃用机制 |
v0.10.0 |
3 |
覆盖率成为硬门禁 |
FastAPI / Starlette 公开声明 100% 覆盖率,pytest 开 |
⚠️ 72.2%,无 |
v0.12.0 |
4 |
完整类型注解 + |
Starlette / FastAPI 均 |
❌ 无 |
v0.11.0 |
5 |
明确的 Python 版本淘汰节奏 |
Starlette 1.8 抬到 3.11、Sanic 25.12 弃 3.9、Quart 0.23 抬到 3.13 |
⚠️ 3.8–3.12,3.8 已 EOL |
v0.14.0 |
6 |
安全响应闭环(GHSA / CVE / 分支回补) |
Django 明确「security trumps the compatibility guarantee」 |
⚠️ 有依赖审计,无响应流程 |
v0.15.0 |
7 |
版本化文档 + 迁移指南 + 废弃时间表 |
Django 有专门的 Deprecation Timeline 页 |
❌ 无 |
v0.10.0 / v0.15.0 |
8 |
生态可互操作(ASGI 中间件规范、插件注册) |
Starlette |
❌ 无 lifespan、无 entry_points |
v0.13.0 |
2.3 Litefs 硬性标准总表(15 条 DoD)
全部满足方可发布 v1.0.0。每条标注交付版本。
# |
硬性标准 |
判定方式 |
交付版本 |
|---|---|---|---|
H1 |
《API 稳定性与 SemVer 政策》已发布并经评审 |
文档存在 + 评审记录 |
v0.10.0 |
H2 |
196 个公共符号完成 |
清单文件 + 逐项 |
v0.10.0 |
H3 |
全部源文件 ≤600 行 |
脚本校验纳入 CI |
v0.10.0 |
H4 |
|
解包 wheel 验证 |
v0.11.0 |
H5 |
|
CI lint 门禁 |
v0.11.0 |
H6 |
弃用机制与废弃时间表就位 |
|
v0.10.0 |
H7 |
整体覆盖率 ≥85% |
|
v0.12.0 |
H8 |
核心模块覆盖率 ≥80% |
|
v0.12.0 |
H9 |
|
pytest 配置核对 |
v0.12.0 |
H10 |
|
单元测试 + 文档示例 |
v0.12.0 |
H11 |
ASGI lifespan 可被 uvicorn / hypercorn 托管 |
集成测试用例 |
v0.13.0 |
H12 |
ASGI 中间件签名兼容 + |
集成测试 + 示例 |
v0.13.0 |
H13 |
GitHub PR 级 CI 全部通过 + Python 3.10–3.14 矩阵全绿 |
PR 状态检查 + CI 矩阵 |
v0.14.0 |
H14 |
|
发布产物核验 |
v0.15.0 |
H15 |
迁移指南 + 变更日志齐备,无未登记的破坏性变更 |
文档评审 + 破坏性变更清单逐条核对 |
v0.15.0 / v1.0.0 |
三、0.x.x 版本路线总览
3.1 版本序列
v0.9.0 ── 2026-10-21 ── 技术债务清理 & 架构统一(已发布)
│
v0.10.0 契约与结构重构 API 政策 + 符号分级 + 弃用机制 + 拆分 5 个大文件
│
v0.11.0 类型系统与打包契约 py.typed 落盘 + mypy --strict 零豁免
│
v0.12.0 测试基础设施与质量基线 conftest + TestClient + 覆盖率 ≥85% + warnings 严格化
│
v0.13.0 ASGI 协议与插件生态 lifespan + streaming + 中间件兼容 + entry_points
│
v0.14.0 工程化与 Python 基线收敛 PR CI 门禁 + 删 setup.py + 依赖 optional 化 + 3.10–3.14
│
v0.15.0 发布基础设施与安全闭环 SECURITY.md + SBOM/签名 + 版本化文档站 + 迁移指南
│
v1.0.0 稳定性声明发布 API 冻结宣告 + 政策定稿 + 标签(几乎零代码变更)
│
v1.0.x 仅安全与严重缺陷修复(1.0 稳定分支)
│
v1.1.x OpenTelemetry 可选中间件
│
v1.2.x HTTP/2 支持
│
v2.0.x ASGI 原生重写 / HTTP/3 / 边缘轻量构建
3.2 判据 × 版本覆盖矩阵
版本 |
主题 |
绑定判据 |
可发布的独立价值 |
工作量 |
|---|---|---|---|---|
v0.10.0 |
契约与结构重构 |
① ② ⑦ |
用户可依赖「哪些 API 会变、什么会被弃用」,代码结构达标 |
≈7d |
v0.11.0 |
类型系统与打包契约 |
④ |
首次提供完整类型支持,IDE 补全与静态检查全量可用 |
≈6d |
v0.12.0 |
测试基础设施与质量基线 |
③ |
质量可度量、可门禁,回归风险显著下降 |
≈12d |
v0.13.0 |
ASGI 协议与插件生态 |
⑧ |
可被 uvicorn/hypercorn 直接托管,插件生态开放 |
≈10.5d |
v0.14.0 |
工程化与 Python 基线收敛 |
⑤ |
安装更轻,Python 淘汰节奏明确 |
≈8d |
v0.15.0 |
发布基础设施与安全闭环 |
⑥ ⑦ |
供应链可信,安全响应有流程 |
≈7d |
v1.0.0 |
稳定性声明发布 |
全部 8 条 |
兑现可依赖的长期承诺 |
≈4d |
合计 |
≈54.5d |
每一版都是完整可发布版本:CHANGELOG 更新、Release Notes、全量回归通过、性能基线不回退、GitHub Release 打标。不存在「半成品中间态发布」。
四、各版本详细规划
4.1 v0.10.0 —— 契约与结构重构
行业第一判据。先立承诺,再动结构。
# |
任务 |
产出 |
验收标准 |
工作量 |
|---|---|---|---|---|
0.10-1 |
编写《Litefs API 稳定性与 SemVer 政策》 |
|
明确:稳定 API 定义、弃用流程、破坏性变更仅走 major、弃用后至少保留 2 个 minor(对标 Django) |
1d |
0.10-2 |
公共 API 分级与冻结 |
|
196 个符号逐个判定 |
2d |
0.10-3 |
弃用机制与时间表 |
|
弃用项带「计划移除版本」;迁移指南模板就位 |
1d |
0.10-4 |
拆分 5 个超 600 行文件 |
见 §六 表 |
全部 ≤600 行;公开 API 零变更;全量回归通过 |
3d |
本版允许的破坏性变更:B4(内部符号加 _ 前缀)、B5(ValidationError 导入路径收敛)、B6(core.py 拆分后私有方法迁移)。
支撑项(已完成,不占用版本额度):
支撑项 |
内容 |
验收标准 |
|---|---|---|
JSON 序列化换用 orjson |
新增 |
源码无 |
公共 API 分级注册表 |
新增 |
契约测试强制每个模块必须被分类 |
出口门禁:
[x] H1、H2、H3、H6 达成
[x] 全部源文件 ≤600 行
[x] 全量 pytest 通过,无行为回归
[x] CHANGELOG 含
Changed/Removed专章
v0.10.0 交付备注:分级实际落地为
stable/provisional/internal三级, 登记 70 个 stable 模块 410 符号 + 32 个 provisional 模块 138 符号(合计 548), 较原计划的 196 符号覆盖更完整;弃用机制与契约测试(tests/unit/test_api_contract.py) 提前至本版完成。5 个超限文件全部拆分至 ≤600 行,公开 API 零变更。
4.2 v0.11.0 —— 类型系统与打包契约
# |
任务 |
产出 |
验收标准 |
工作量 |
|---|---|---|---|---|
0.11-1 |
|
|
wheel 内实际包含 |
0.5d |
0.11-2 |
|
53 个豁免清零 |
|
5d |
0.11-3 |
公共 API 标注补齐 |
稳定符号补全类型注解与 docstring |
196 个 stable 符号 100% 有类型注解与文档 |
0.5d |
出口门禁:
[ ] H4、H5 达成
[ ]
mypy --strict src/零错误、零豁免(CIallow_failure: false)[ ] wheel 解包确认含
py.typed[ ] 运行时行为零变化(回归全绿)
4.3 v0.12.0 —— 测试基础设施与质量基线
本版是 1.0 最大的实质风险所在:框架最核心的自研服务器代码覆盖率最低。
# |
任务 |
产出 |
验收标准 |
工作量 |
|---|---|---|---|---|
0.12-1 |
核心服务器覆盖率补齐 |
新增测试模块 |
|
6d |
0.12-2 |
|
测试基础设施 |
|
1d |
0.12-3 |
|
|
httpx 驱动,支持 WSGI + ASGI 两种 app,Cookie 持久化、状态码断言 |
2d |
0.12-4 |
覆盖率补齐(非核心模块) |
新增/扩充测试 |
整体 ≥85%; |
5d |
0.12-5 |
pytest 严格化 |
|
启用 |
1d |
本版允许的破坏性变更:B8(pytest filterwarnings=error,仅影响项目自身测试)。
出口门禁:
[ ] H7、H8、H9、H10 达成
[ ]
coverage report --fail-under=85通过[ ]
pytest在filterwarnings = error下全绿[ ] 性能回归门禁 RPS ≥ v0.9.0 基线
4.4 v0.13.0 —— ASGI 协议与插件生态
# |
任务 |
产出 |
验收标准 |
工作量 |
|---|---|---|---|---|
0.13-1 |
ASGI lifespan 协议 |
|
uvicorn / hypercorn 直接托管 Litefs ASGI app 正常启停; |
2d |
0.13-2 |
原生 ASGI streaming 响应 |
响应对象直通 |
不再经过 WSGI environ 转换;SSE / 流式大文件不缓冲 |
3d |
0.13-3 |
ASGI 中间件签名兼容 |
|
Starlette 风格 |
2d |
0.13-4 |
|
|
支持 |
1.5d |
0.13-5 |
集成测试与示例 |
测试 + |
uvicorn/hypercorn 托管用例;entry_points 示例;streaming 示例 |
2d |
出口门禁:
[ ] H11、H12 达成
[ ] uvicorn / hypercorn 托管 Litefs ASGI app 启停正常
[ ] Starlette 风格中间件可直接挂载并通过用例
[ ]
entry_points插件可被发现(集成测试通过)
4.5 v0.14.0 —— 工程化与 Python 基线收敛
# |
任务 |
产出 |
验收标准 |
工作量 |
|---|---|---|---|---|
0.14-1 |
GitHub PR 级 CI 门禁 |
|
PR 触发 lint(flake8+ruff+mypy strict)+ test(3.10–3.14 矩阵)+ coverage 门禁; |
2d |
0.14-2 |
删除 |
单一 |
全部元数据迁入 PEP 621; |
1d |
0.14-3 |
核心依赖 optional 化 |
|
|
2d |
0.14-4 |
extras 矩阵重整 |
|
每个 extra 有明确用途与文档说明; |
1d |
0.14-5 |
Python 基线收敛 3.10–3.14 |
|
弃 3.8/3.9;新增 3.13/3.14; |
1d |
0.14-6 |
可选依赖缺失时的友好提示 |
启动期检查 |
缺失可选依赖时给出明确的中文错误提示与安装命令(不做静默降级) |
1d |
本版允许的破坏性变更:B1(核心依赖 optional 化)、B2(删除 setup.py)、B3(Python 基线 3.10+)。
出口门禁:
[ ] H13 达成
[ ] PR 级 CI 三级门禁上线,Python 3.10–3.14 矩阵全绿
[ ]
pip install litefs不再拉入 SQLAlchemy / watchdog / greenlet[ ] 迁移说明已在 CHANGELOG 给出(
pip install litefs[full]一键方案)
4.6 v0.15.0 —— 发布基础设施与安全闭环
# |
任务 |
产出 |
验收标准 |
工作量 |
|---|---|---|---|---|
0.15-1 |
|
安全策略文档 + 私有报告通道 |
明确漏洞报告方式、响应时限、分支回补规则(对标 Django「安全优先于兼容承诺」) |
0.5d |
0.15-2 |
SBOM 与签名发布 |
|
每版发布附带 SBOM;wheel/sdist 签名并在 PyPI 展示 |
1.5d |
0.15-3 |
版本化文档站 |
ReadTheDocs 配置 |
按版本发布;每版含迁移指南与废弃时间表 |
1.5d |
0.15-4 |
LTS 政策 |
政策文档 |
对标 Django:每 2 年一个 LTS、支持期 3 年、LTS 命名为 |
0.5d |
0.15-5 |
迁移指南 |
文档 |
从 v0.9.0 逐版升级到 v0.15.0 的操作说明 + 0.15.0 → 1.0.0 预告 |
1.5d |
0.15-6 |
全量回归 + 性能基线复核 |
回归报告 |
覆盖率 ≥85%、mypy strict 零错误、pytest 全绿、RPS ≥ v0.9.0 基线 100% |
1.5d |
出口门禁:
[ ] H14、H15 达成
[ ] SBOM 与签名产物随发布产出
[ ] 文档站可按版本访问
[ ] 迁移指南覆盖 0.9.0 → 0.10.0 → … → 0.15.0 的全部破坏性变更
4.7 v1.0.0 —— 稳定性声明发布
本版几乎不做代码变更。 当 0.10.0 – 0.15.0 逐版交付完毕、15 条硬性标准全部达成后,1.0.0 只是把「事实上已经稳定」的状态正式宣告出来。
# |
任务 |
验收标准 |
工作量 |
|---|---|---|---|
1.0-1 |
API 冻结确认 |
196 个符号分级清单签字冻结,stable 集合不再变更 |
0.5d |
1.0-2 |
《API 稳定性与 SemVer 政策》正式版定稿 |
文档从「草案」转「生效」,明确 1.0 后的兼容承诺 |
0.5d |
1.0-3 |
|
汇总 0.9.0 → 1.0.0 全部 |
0.5d |
1.0-4 |
全量回归 + 性能基线复核 |
覆盖率 ≥85%、mypy strict 零错误、pytest 全绿、RPS ≥ v0.9.0 基线 100% |
1d |
1.0-5 |
|
|
0.5d |
1.0-6 |
打标签 + 发布 + GitHub Release |
|
0.5d |
1.0-7 |
|
建立 |
0.5d |
出口门禁(硬性):
[ ] H1 – H15 全部达成,无一例外
[ ] 0.10.0 – 0.15.0 全部已发布并可被用户安装
[ ]
Development Status为5 - Production/Stable[ ] v1.0.0 相对 v0.15.0 的代码变更量 ≤ 政策性改动(无功能性变更)
五、破坏性变更清单与分配
每项均须在
docs/source/migration-v1.md中给出前后对照。
# |
变更 |
影响 |
兼容处理 |
分配版本 |
|---|---|---|---|---|
B1 |
核心依赖 optional 化 |
|
需功能者改用 |
v0.14.0 |
B2 |
删除 |
仅影响源码安装者 |
|
v0.14.0 |
B3 |
Python 基线 3.10+ |
弃 3.8 / 3.9 |
|
v0.14.0 |
B4 |
内部符号加 |
少数用户可能引用了内部符号 |
保留旧名别名 + |
v0.10.0 |
B5 |
|
|
统一到 |
v0.10.0 |
B6 |
|
极少数用户直接调 |
|
v0.10.0 |
B7 |
|
无运行时影响 |
|
v1.0.0 |
B8 |
pytest |
仅影响项目自身测试 |
用户测试不受影响 |
v0.12.0 |
范围约束:以上 8 项之外,各 0.x 版本不引入新的破坏性变更。已弃用但未列入的项,一律推迟到 2.0。
六、超 600 行文件拆分方案(v0.10.0 交付)
文件 |
当前行数 |
拆分方案 |
目标 |
|---|---|---|---|
|
828 |
抽出 |
3 个 ≤350 行 |
|
780 |
抽出 |
2 个 ≤450 行 |
|
775 |
模板外置为 |
≤200 行 |
|
639 |
抽出 |
2 个 ≤400 行 |
|
628 |
抽出 |
2 个 ≤400 行 |
约束:拆分过程中公开 API 与运行时行为零变化;每个文件拆分后立即跑全量回归;优先使用延迟导入规避循环依赖(core.py 拆分已验证该路径可行)。
七、风险与对策
风险 |
等级 |
对策 |
|---|---|---|
核心服务器覆盖率补齐耗时超预期 |
高 |
优先用「协议级」测试(构造真实 socket 报文驱动 |
|
高 |
0.11-2 与 0.12-1 并行;先收敛 |
optional 化后用户环境碎片化 |
中 |
提供 |
0.x 版本序列拉得过长,用户产生疲劳 |
中 |
每版周期控制在 1–2 个迭代;每版必须有可感知的独立价值(类型支持 / 质量门禁 / ASGI 兼容 / 轻安装 / 安全闭环) |
1.0 承诺后被紧急修复破坏 |
中 |
建立 |
性能回退 |
中 |
每版复用 |
文档版本化与代码脱节 |
低 |
CI 中加「文档代码块可执行性」抽样检查 |
八、版本策略、LTS 与弃用政策
8.1 里程碑与版本策略
0.x 阶段(v0.10.0 – v0.15.0):minor 递增即可能含破坏性变更
每一版独立可发布、独立验证、独立维护
1.0 之后:严格 SemVer
破坏性变更只走 major;弃用项移除前至少保留 2 个 feature release
8.2 LTS 政策(对标 Django)
规则 |
内容 |
|---|---|
命名 |
|
频率 |
每 2 年一个 LTS |
支持期 |
3 年(mainstream 约 8 个月 + extended 约 2 年) |
微版本 |
不限(如 Django 4.2 出了 30 个微版本) |
回补 |
同一 LTS 分支内的安全修复同时回补到上一个 LTS |
优先级 |
安全问题优先于向后兼容承诺 |
8.3 弃用策略
弃用项必须同时标注「替代方案」与「计划移除版本」
0.x 阶段:纯内部重构可直接 break(SemVer 允许);用户可见的 stable 公共 API 须至少保留 1 个 minor 的
DeprecationWarning过渡1.0 之后:弃用后至少保留 2 个 feature release 才可移除,且移除只发生在 major 版本
每次移除在
CHANGELOG.md单列Removed专章
九、v1.x 长期技术方向
方向 |
说明 |
目标版本 |
|---|---|---|
协议层抽象 |
HTTP / WSGI / ASGI / WebSocket 统一为 Protocol 抽象层,新协议只需实现接口 |
v2.x |
ASGI 原生化 |
scope / receive / send 直通,WebSocket 纳入 ASGI scope,可与 Starlette 中间件完全互操作 |
v2.x |
HTTP/2 / HTTP/3 |
|
v1.2 / v2.x |
OpenTelemetry |
原生 |
v1.1 |
边缘轻量构建 |
去除 SQLAlchemy / greenlet 重依赖,产出 |
v2.x |
热点路径加速 |
路由匹配与序列化路径的 Rust / C 扩展,uvloop 集成 |
v2.x |
插件市场 |
基于 |
v1.3 |
十、文档产出物
文档 |
路径 |
交付版本 |
|---|---|---|
API 稳定性政策 |
|
v0.10.0 |
公共 API 分级清单 |
|
v0.10.0 |
弃用时间表 |
|
v0.10.0 |
迁移指南 |
|
v0.15.0 |
安全策略 |
|
v0.15.0 |
本文 |
|
本方案 |
文档维护: 开发团队 评审状态: 待评审 上次更新: 2026-10-21