Files
Unlucky-Launcher/crates/core/src/lib.rs
T
AskaEth 2e718af711 feat(core): 新增 update 模块,做与更新源无关的自更新内核
更新源还没拍板,所以先把与源无关的那半边做掉:语义化版本比较、发布清单模型、
渠道准入、下载校验、原子替换 + 回滚。源抽象成 UpdateSource trait(清单 + 包体两个
方法),core 里没有任何 CDN 常量;内置的 DirSource 吃本地目录或 file://,既是测试
实现也是将来 HTTP 源的对照物。

取舍:
- 版本比较严格按 semver 2.0 §11:数值比(0.9 < 0.10)、预发布 < 同号正式版、
  预发布标识逐段比(alpha < beta < rc 是 ASCII 序的自然结果,不另立阶段权重表)、
  构建元数据不参与排序与相等。
- 渠道准入两道判据:清单自报渠道的阶梯比较 + 版本号里的预发布阶段。清单可能写错,
  版本号不会,所以正式版渠道即使拿到一份自称 stable 的 rc 也不会提示更新。
- 校验两道判据且顺序有意:先比长度(抓截断,不必读全文件)再比摘要(抓内容错),
  长度要求**恰好**相等;失败即删暂存文件。StagedPackage 只能由 stage() 产出,
  于是「未校验的包」在类型上就进不了安装路径。
- 替换跨平台统一成「旧文件改名挪开 → 新文件搬进来 → 失败把备份搬回去」:Windows 上
  覆盖运行中的 exe 不存在,改名是唯一可用动作,而改名也可能被不共享删除的句柄拒绝,
  所以失败必须能回滚。Unix 也照这个顺序跑,避免回滚路径只有 Windows 被真正跑过。
- core 零 UI 依赖不变:只有 serde/serde_json + 复用的 sha1/sha2,无新依赖,
  Cargo.toml 未改;不接 presenter、不接 UI。

单测 62 条(crates/core/src/update/tests/):版本边界、清单校验、渠道准入、
摘要不符、包体截断(短了/多了)、无权限写目标目录、Windows 占用文件、回滚与备份清理。
2026-11-06 19:16:15 +08:00

26 lines
996 B
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! Unlucky-Launcher 领域库(`unlucky_core`)。
//!
//! 本 crate **零 UI 依赖**:UI 框架(Slint)只允许出现在 `crates/app`。
//! 这是对 HMCL「HMCLCore 34 处 import javafx」架构债的正面修正,
//! 由 `.github/workflows/guards.yml` 的 `core-no-ui` job 在 CI 守门。
//!
//! core 对 UI 的回调只有三条通道(见 `DevDocs/PlanDoc/01-tech-stack-and-architecture.md` §3):
//! 1. 不可变快照发布;2. 事件流(启动/下载/诊断 JSONL 事件);3. 注入的显示服务接口(进度/确认)。
//!
//! 设计定稿索引:`DevDocs/PlanDoc/00-master-architecture.md`。
//! 各模块的设计文档在对应 `mod.rs` 的模块注释里点名。
//!
//! 当前状态:P0 脚手架,只有模块骨架与设计注释,实现按 M12–M15/M18 分批落地。
#![forbid(unsafe_code)]
pub mod addon;
pub mod auth;
pub mod diagnose;
pub mod download;
pub mod game;
pub mod launch;
pub mod platform;
pub mod setting;
pub mod update;