跳转至

校验 OBPM 工作区 XML(verify-workspace)

OBPM/MyApps 的应用是一堆 workspace XML 文件.module / .form / .view / .column / .activity / .menu / .role / .datasource。它们之间靠 id 交叉引用 粘合(列的 parentView 指向视图、视图的 relatedForm 指向表单、菜单的 actionContent 指向视图……)。这些引用**不会在保存时被校验**——写错 id,文件照样落盘,但运行时视图打不开、 菜单点不动、甘特图画不出条,而且报错往往很隐晦。

本技能提供一个脚本,在落盘之后、声称"完成"之前,把整应用的引用关系扫一遍。

两个最容易踩的坑(脚本会帮你抓)

  1. id 是根元素的属性,不是子元素。 OBPM 写的是 <module id="..."><form id="..."><column id="...">——id 挂在根标签上,根的子元素是 name / parentId / ……。写成 <module><id>...</id></module> 是错的。 常见误判:用 findtext("id") 取 id 会拿到 None,必须用 root.get("id")

  2. 引用是"按文件 + parentView/parentForm"关联,不是内嵌。 列/操作/事件 各自独立成文件,靠同目录 + parentView=视图 id 关联。漏写或写错 parentView, 列就"飘"在那儿、不属于任何视图。

怎么用

python "<skill-dir>/scripts/verify_workspace.py" "<application_dir>"
  • <application_dir>:某个 .application 目录的绝对路径。
  • 退出码:0 = 干净;1 = 有问题;2 = 参数错误。
  • 非 XML 文件(pid.index / url.index / .md / .sql / .html)自动跳过。

输出形如:

=== verify_workspace: .../test01.application ===
Templates: 52  |  unique ids: 50  |  non-XML skipped: 2
All templates parse, ids unique, cross-references resolve. OK

有问题时逐条列出,例如:

FAIL: module/工程项目管理.module/任务甘特图.view/任务名称.column: <parentView>=__xxx resolves to no resource id
FAIL: menu/任务甘特图.menu/任务甘特图.menu: actionContent=__badId resolves to no view id
FAIL: module/.../任务登记.form: templatecontext JSON invalid: ...

它检查什么

检查 说明
XML 合法性 每个模板能被解析;非 XML 自动跳过
id 为根属性 根元素必须有 id 属性(坑 #1)
id 唯一 同一应用内 id 不能重复(会污染 index)
引用解析 parentId / parentView / parentForm / formid / relatedForm / onActionForm / onActionView / moduleid / searchFormId / templateForm / dataSourceId / relatedFormId 必须指向应用内真实存在的 id
菜单 actionContent linkType=01 的菜单,actionContent 必须指向某个视图 id
表单 templatecontext 新式 JsonTemplate(内容以 { 开头)必须是合法 JSON;旧式 HTML 模板表单(以 < 开头)跳过
甘特 mappingField 父视图为 GanttView 的列,mappingField 必须是 name/start/end/complete/color/parent/dependency 之一

故意不检查的项

  • styleId:样式常来自应用外的全局样式库,未解析多为误报,故不查。
  • linkType≠01 菜单的 actionContentlinkType=07 等的 actionContent 是 URL/脚本而非 id,只在 linkType=01(视图链接)时校验。

何时运行

  • 新建/修改/删除任何 workspace 模板文件之后;
  • **在 rebuild-index 之前**跑通(先修引用错误,再重建索引,避免脏 id 进 pid.index/url.index);
  • 视图/表单/菜单打不开、怀疑引用断裂时——先跑它定位。

跑通(退出 0)不等于功能 100% 正确,但能挡住绝大多数"引用写错导致运行时白屏"的问题。