Files
SpineParticlesWeb/DateToSpine/docs/03-版本识别与编辑器检测.md
T
2026-09-07 21:29:15 +08:00

194 lines
5.3 KiB
Markdown
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.
# 版本识别与 Spine Editor 检测
## 1. 目标
在用户确认转换前,软件必须回答:
1. 资源由哪个 Spine 主/次版本导出?
2. 本机是否有可以处理该版本的 Spine Editor
3. 配置路径是否指向可用的 Spine CLI?
4. 在断网状态下,该版本是否能实际启动和导入?
路径存在不等于 Editor 可用。当前实现先读取本机 Spine 更新缓存,只把已经存在的精确版本视为可转换;转换时再次执行同一门禁。
## 2. 资源版本识别
### 2.1 JSON
读取 `skeleton.spine` 字段,并同时验证最小 Spine schema
- 根对象
- `bones` 数组
- 可选 `slots``skins``animations`
- 版本字段格式
只解析识别所需的小范围数据。无 Spine schema 的业务 JSON 必须忽略。
### 2.2 SKEL
识别顺序:
1. 对二进制头执行有界读取,尝试提取 hash 和版本字符串。
2. 用候选版本 Runtime 插件执行只读探测。
3. 必要时用已配置 Editor 的 info 命令验证。
4. 多个版本都失败则要求用户选择版本,并标记为未确认。
解析必须限制字符串长度、数组大小和文件大小,损坏文件不能导致无限分配。
## 3. Editor 数据模型
```text
EditorInstallation
id
displayName
platform
userSelectedPath
canonicalExecutable
discoverySource
lastVerifiedAt
baseVersion
signatureStatus
capabilities[]
EditorCapability
versionLine // 3.8, 4.0, 4.1, 4.2, 4.3
launchSelector // 可选 -u 参数或独立 executable
status
lastProbeResult
```
同一个安装入口可以声明多个本地版本能力;多个安装入口也可以映射到同一版本。用户可为每个版本选择首选项。
## 4. 自动发现
### 4.1 macOS
优先位置:
```text
/Applications/Spine.app
~/Applications/Spine.app
```
补充来源:
- 系统应用索引
- 当前会话已知应用路径
- 历史用户配置
用户选择 `.app` 时规范化为:
```text
Spine.app/Contents/MacOS/Spine
```
不递归扫描整个磁盘。
### 4.2 Windows
发现来源:
- HKLM/HKCU 安装与卸载注册信息
- `Program Files``Program Files (x86)` 常见位置
- `PATH`
- 开始菜单快捷方式目标
- 历史用户配置
CLI 优先选择 `Spine.com`。如果用户选择 `Spine.exe`,查找同目录同名 `.com`;找不到时允许保存,但状态为“GUI 路径,CLI 待验证”。
## 5. 自定义路径
用户可选择:
- macOS `.app`
- 内部 Spine 可执行文件
- Windows `Spine.com``Spine.exe`
- 包含上述文件的目录
保存前执行路径规范化:
- 解析相对路径
- 清理多余分隔符
- 保留用户显示路径
- 保存 canonical path
- 记录文件标识和修改时间,用于发现安装被替换
路径移动或升级后,不自动删除旧配置,而是标记失效并允许重新定位。
## 6. 验证步骤
### 6.1 静态验证
- 文件存在且不是目录。
- 当前用户可执行。
- macOS bundle 结构或 Windows 同目录文件合理。
- 可选检查平台签名;旧版签名异常只警告,不直接否定合法安装。
### 6.2 基础进程验证
使用参数数组执行 `--version`,捕获:
- 退出码
- 标准输出和错误输出
- 启动耗时
- 报告版本
设置短超时,只终止该次探测进程。
### 6.3 版本能力验证
对用户配置的目标版本执行实际启动探测。若使用 `-u <version>` 选择器:
- 只允许已确认在本地缓存中存在的精确版本,例如资源线为 4.3 时选择本地最新的 `4.3.23`
- 不使用 `--force`
- 不使用 `latest``stable``beta``x.x.xx` 版本选择器。
- 不由 DateToSpine 发起下载。
- 缓存缺失时不启动 Spine Launcher,直接报告“本地未缓存目标版本”,从源头避免 Launcher 下载。
- 启动进程前再次检查精确缓存文件,避免检测后被移动导致意外联网。
当前 macOS 检查 `~/Library/Application Support/Spine/updates`Windows 检查 `%APPDATA%/Spine/updates``%LOCALAPPDATA%/Spine/updates`。后续若 Spine 改变缓存结构,需要同步更新并重新做断网回归。
### 6.4 导入冒烟测试
在用户点击“深度验证”或首次转换前,可在临时目录执行小型导入:
- 输入与版本匹配的最小测试数据。
- 输出到临时目录。
- 验证退出码和 `.spine` 可再次读取。
- 完成立即清理临时结果。
发行版不能使用未获再分发确认的官方测试资产作为内置冒烟样本;需要自有最小样本或仅对用户当前资源执行验证。
## 7. 状态与用户提示
```text
Available
PathMissing
NotExecutable
NotSpine
CliCompanionMissing
VersionMismatch
VersionNotPrepared
NotActivated
ProbeTimedOut
PermissionDenied
LaunchFailed
Unknown
```
每个状态需要:
- 用户可读说明
- 技术详情
- 可执行的修复建议
- 是否允许预览
- 是否允许转换
资源全部载入后,主界面顶部直接显示当前资源的结果,例如“可转换 · Spine 4.3.23”或“缺少 Spine 4.1”。自动检测失败时,转换按钮才变为“指定 Spine 路径”。
## 8. 离线要求
DateToSpine 本身不联网。完整转换成立的前提是对应 Editor 版本已经在本机准备好并能在断网时运行。
离线验收必须在网络被禁用的独立测试环境进行,不能只通过代码审查推断。