mirror of
https://github.com/Yuyi-Oak/BlueArchiveToolkit.git
synced 2026-07-22 01:36:43 +08:00
feat(daemon): 任务历史文件态持久化与 .env 无参启动(issue #1)
任务持久化: - 任务历史落 <state-dir>/bat-tasks.json(版本化、0600 原子写、不跟随 symlink),生命周期转换时 write-through;seq 持久化避免 pid 复用撞 ID - daemon 重启恢复历史,中断时仍 queued/running 的任务标记 failed, 新增错误码 TASK_INTERRUPTED(BAT-ERR-700005) - 损坏文件改名 .corrupt 留证后从空历史开始;无法识别的记录计数跳过 - core 新增 ErrorCode::ALL 公开码表与 from_id 反查(持久化错误码往返) .env 配置: - 首次启动在二进制所在目录释放 .env 模板(0600、create_new 防竞态), 之后每次启动加载为进程环境变量(不覆盖已存在变量) - 优先级:CLI > 进程环境变量 > .env > 内置默认;BAT_* 键映射到 CliOptions 默认值,BAT_WATCH/BAT_DAEMON 仅对无子命令 Run 生效且 CLI 显式模式/dry-run 时让位;Redis 键预留(未接入) - 工具/代理"非默认"判断改按 env 应用后基线,status/stop/logs 在 .env 存在时不误判;BAT_SKIP_ENV_FILE=1 整体禁用 验证:新增 10 个单测(env 解析/优先级/守卫回归/持久化往返/中断标记/ 损坏恢复/未知类型跳过);真机 e2e:.env 释放加载、daemon 纯 .env 启动、 catalog.refresh 任务带类型化错误码落盘并跨 daemon 重启恢复(含日志); fmt / clippy --workspace --all-targets -D warnings / test --workspace 全绿 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+14
-2
@@ -116,10 +116,21 @@ HTTPS_PROXY=http://user:pass@127.0.0.1:7890 bat --auto-discover --daemon
|
||||
|
||||
- 平台:`Windows,Android`。
|
||||
- 资源输出:`./bat-resources`(`current` → `versions/<id>`、`.staging/<id>`)。
|
||||
- 后台状态目录:`/tmp/bat-pid`(`bat.sock`、`bat.pid`、`bat-status.json`、`bat-daemon.log`、`bat-events.jsonl`、短生命周期 `bat-control.lock`;代理凭据在 `bat-proxy.secret`,`0600`)。
|
||||
- 后台状态目录:`/tmp/bat-pid`(`bat.sock`、`bat.pid`、`bat-status.json`、`bat-daemon.log`、`bat-events.jsonl`、任务历史 `bat-tasks.json`、短生命周期 `bat-control.lock`;代理凭据在 `bat-proxy.secret`,`0600`)。
|
||||
- 强制刷新:每天北京时间(UTC+8)`03:00`、`16:00`、`18:00` 各一次。
|
||||
- 状态类文件默认 `0600` 权限,读写不跟随 symlink。
|
||||
|
||||
### 配置文件(`.env`,无参启动)
|
||||
|
||||
`bat` 首次启动时会在**二进制所在目录**释放一个 `.env` 配置模板(`0600` 权限,已存在则不动)。之后每次启动自动加载该文件,把其中的键作为进程环境变量(不覆盖已存在的环境变量),因此编辑 `.env` 后直接运行 `bat`(无参数)即可按配置启动。
|
||||
|
||||
- 优先级:**命令行参数 > 进程环境变量 > `.env` > 内置默认值**。
|
||||
- 语法:每行 `KEY=VALUE`;`#` 开头为注释;值两侧成对引号会剥除;空值视为未设置。
|
||||
- 支持的键:`BAT_OUTPUT`、`BAT_STATE_DIR`、`BAT_AUTO_DISCOVER`、`BAT_WATCH`、`BAT_DAEMON`、`BAT_PROXY`、`BAT_NO_PROXY`、`BAT_INTERVAL_SECONDS`、`BAT_ERROR_RETRY_SECONDS`、`BAT_APP_VERSION`、`BAT_CONNECTION_GROUP`、`BAT_LAUNCHER_VERSION`、`BAT_PLATFORMS`、`BAT_CURL`、`BAT_UNZIP`、`BAT_JSON`、`BAT_QUIET_UP_TO_DATE`;也可以直接写 `HTTPS_PROXY` 等通用环境变量(走现有代理自动检测)。布尔值支持 `1/0/true/false/yes/no/on/off`。
|
||||
- `BAT_WATCH` / `BAT_DAEMON` 只对无子命令的 `bat` 生效(两者同时为 `1` 时 daemon 优先);命令行显式传入 `--watch` / `--daemon` / `--dry-run` 时 `.env` 的模式开关让位。`status` / `verify` 等子命令不受它们影响。
|
||||
- `BAT_REDIS_URL` / `BAT_REDIS_PASSWORD` 为**预留键**:Redis 任务后端尚未接入,当前任务历史持久化在 `<state-dir>/bat-tasks.json`。
|
||||
- 设 `BAT_SKIP_ENV_FILE=1` 可让 `bat` 完全跳过 `.env` 的生成与加载。
|
||||
|
||||
---
|
||||
|
||||
## 4. 退出码
|
||||
@@ -219,6 +230,7 @@ HTTPS_PROXY=http://user:pass@127.0.0.1:7890 bat --auto-discover --daemon
|
||||
| `BAT-ERR-700002` | rpc_invalid_params | 否 | RPC 参数无效 |
|
||||
| `BAT-ERR-700003` | rpc_not_implemented | 否 | 方法/命名空间尚未实现 |
|
||||
| `BAT-ERR-700004` | task_not_found | 否 | 任务不存在 |
|
||||
| `BAT-ERR-700005` | task_interrupted | 否 | 任务因 daemon 停止/重启而中断 |
|
||||
| `BAT-ERR-900001` | internal | 否 | 未归类的内部错误 |
|
||||
|
||||
新增错误码在 `core/src/error_code.rs` 的码表登记后,同步更新本表。
|
||||
@@ -290,7 +302,7 @@ HTTPS_PROXY=http://user:pass@127.0.0.1:7890 bat --auto-discover --daemon
|
||||
|
||||
- `task.cancel` 请求取消:置任务的取消标志,worker 在下一个同步检查点中止,任务转为 `cancelled`(协作式,不硬杀正在执行的 curl)。
|
||||
- 与后台 watch 循环的定时同步通过进程内锁互斥(任务等待而非失败)。
|
||||
- 任务目前**仅存内存**,随 daemon 生死;持久化(重启后仍可查)为后续工作。
|
||||
- 任务历史**持久化**在 `<state-dir>/bat-tasks.json`(版本化、`0600` 原子写):生命周期转换(入队/开始/结束)时落盘,进行中任务的 `stage`/`message`/日志以内存实时值为准、随下一次转换写入。daemon 重启后历史任务经 `task.status` / `task.list` / `task.logs` 仍可查;重启时仍处于 `queued`/`running` 的任务标记为 `failed`(错误码 `BAT-ERR-700005` task_interrupted)。文件损坏时改名 `bat-tasks.json.corrupt` 留证并从空历史开始。历史保留最近 64 条(运行中任务不裁剪)。
|
||||
|
||||
### 示例
|
||||
|
||||
|
||||
Reference in New Issue
Block a user