校验 OBPM 工作区 XML(verify-workspace)¶
OBPM/MyApps 的应用是一堆 workspace XML 文件:.module / .form / .view /
.column / .activity / .menu / .role / .datasource。它们之间靠 id 交叉引用
粘合(列的 parentView 指向视图、视图的 relatedForm 指向表单、菜单的 actionContent
指向视图……)。这些引用**不会在保存时被校验**——写错 id,文件照样落盘,但运行时视图打不开、
菜单点不动、甘特图画不出条,而且报错往往很隐晦。
本技能提供一个脚本,在落盘之后、声称"完成"之前,把整应用的引用关系扫一遍。
两个最容易踩的坑(脚本会帮你抓)¶
-
id 是根元素的属性,不是子元素。 OBPM 写的是
<module id="...">,<form id="...">,<column id="...">——id 挂在根标签上,根的子元素是name/parentId/ ……。写成<module><id>...</id></module>是错的。 常见误判:用findtext("id")取 id 会拿到None,必须用root.get("id")。 -
引用是"按文件 + parentView/parentForm"关联,不是内嵌。 列/操作/事件 各自独立成文件,靠同目录 +
parentView=视图 id 关联。漏写或写错parentView, 列就"飘"在那儿、不属于任何视图。
怎么用¶
<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菜单的actionContent:linkType=07等的actionContent是 URL/脚本而非 id,只在linkType=01(视图链接)时校验。
何时运行¶
- 新建/修改/删除任何 workspace 模板文件之后;
- **在
rebuild-index之前**跑通(先修引用错误,再重建索引,避免脏 id 进pid.index/url.index); - 视图/表单/菜单打不开、怀疑引用断裂时——先跑它定位。
跑通(退出 0)不等于功能 100% 正确,但能挡住绝大多数"引用写错导致运行时白屏"的问题。