跳转至

Rebuild Application Index Files

本技能为 .application 目录重建两份索引,并在完成后**必须**投递 *.clear_cache 触发设计时缓存刷新:

  • pid.index — 模板父子关系。格式:childTemplateId=parentTemplateId
  • url.index — 模板 id → 应用内相对路径。格式:templateId=/appName.application/relative/path/to/file
  • *.clear_cache — 按 applicationId 清空设计时对象缓存、重建数据源(不停 url.index 监听)

机制见 design/workspace-structure-and-mechanism.md §7.3、§7.5(*.clear_cache)。

When to use

模板 XML 被增删改/搬移后,索引会与磁盘不同步。本技能扫描整个 .application 目录,从零再生两份索引;仅改 url.index 会触发 Runtime 重装索引属性,但**不会** clear 已有对象缓存——Agent / 手工批量改盘后须再投递 *.clear_cache 丢弃脏缓存。

Template file format

模板为 XML。模板 id 取根元素 id 属性;父 id 取子元素 <parentId>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<resourceVO id="__7PNKKfI4LsbyWz0L7cX">
  <name>问卷首页</name>
  <parentId>__XelBa3DfXZSIOazulYu</parentId>
  ...
</resourceVO>

Steps(按序,缺一不可)

  1. 与用户确认目标 .application 目录绝对路径。
  2. 运行重建索引脚本:
python "<skill-dir>/scripts/rebuild_index.py" "<application_dir>"

<skill-dir> 换为本技能目录,<application_dir> 换为 .application 绝对路径。

  1. 核对输出:脚本会打印写入条目数。可读生成的 pid.index / url.index,向用户摘要(条数、前几行)。

  2. 必做:投递 *.clear_cache(见下「缓存刷新」)。索引写完后立刻执行,勿跳过。

  3. 若用户要核对结果,展示两份索引内容,并说明 .clear_cache 归档结果(.done / .failed / 超时)。

缓存刷新(*.clear_cache,必做)

Agent / 手工改盘后重建索引,必须**再向 workspace/.sync/ 投递 *.clear_cache,否则 Runtime 可能仍持有旧对象缓存(url.index 变更监听只 initIndex,**不 clear + reloadCacheFromDisk)。

约定
路径 {myapps.storage.root}/workspace/.sync/{任意前缀}.clear_cache
内容 一行纯文本:applicationId(软件根元素 id 属性)
前缀 建议 {软件名}-{时间戳},避免与旧归档混淆
不做 **不**停该应用 url.index 监听;不 reloadCacheFromDisk / initCache
# 文件:workspace/.sync/LeaveOA-20260720153000.clear_cache
sOZu9kthmxyP8qQfq0e

推荐:用脚本投递并等待归档

python "<skill-dir>/scripts/clear_cache.py" "<application_dir>"
# 可选:--initial-delay 2 --poll-interval 2 --timeout 120
#       --workspace "<storage/workspace>"

脚本从 {name}.application/{name}.application 读取根属性 id,写入触发文件,再按 initial-delay → 轮询 → timeout 检查归档。

退出码 含义 Agent 行为
0 已进 .sync/.done/ 缓存已清,可继续
1 已进 .sync/.failed/ 必须警告用户;查 applicationId / 软件是否存在;修正后**重新投递新文件**
2 路径/XML/缺 id 先修 .application 元数据再投递
3 超时未归档 确认 Runtime/Manager/Job 已监听 .sync/Designer 不处理

**禁止**投递后立刻读盘判定成功/失败。失败时勿改 .failed 内旧文件指望重试。

处理流程

写入 .sync/{name}.clear_cache
  → SyncMonitorListener(或启动 drain)
  → 读取 applicationId
  → DesignTimeSerializableCache.clear(applicationId)
  → DataSourceEnv.destoryDataSource + initDataSource
  → 清多语言 / 菜单 / 权限 / MyCache / 流程实例 / JS
  → 成功 → .sync/.done/;失败 → .sync/.failed/

Notes

  • 脚本尝试将文件当 XML 解析,非 XML 自动跳过。
  • 根元素无 id 属性的文件忽略。
  • 仅有非空 <parentId> 的条目进入 pid.index
  • 脚本覆盖已有 pid.indexurl.index
  • url.index 路径一律正斜杠。
  • 重建索引与清缓存**成对执行**:只 rebuild 不投递 *.clear_cache → 设计时对象缓存可能仍脏。