XLang、XPL、XLib 与 xrun 基础
本页只回答一个高频问题:
当你在当前仓库里遇到 .xpl、.xlib、.xrun、.xgen 时,应该怎么快速理解它们的角色和最基本写法。
默认结论
.xpl是模板或执行片段,常见于代码生成和文本输出。.xlib是可复用的 XLang 库入口。.xrun是 runner / CLI 任务入口,常通过xpl:lib调用 XLib。.xgen常用于生成链路中的模板或预编译生成。- 日常开发只需要记住少量通用控制语法,不要一开始就深挖整套 XLang 语义。
先区分这四类文件
| 文件类型 | 常见用途 | 真实例子 |
|---|---|---|
.xpl |
模板片段、文本输出、生成逻辑 | nop-wf/nop-wf-web/src/main/resources/_vfs/nop/wf/xlib/dingflow-gen/impl_GenComponents.xpl |
.xlib |
复用库、可调用动作集合 | nop-task/nop-task-core/src/main/resources/_vfs/nop/task/xlib/task.xlib |
.xrun |
runner / CLI 任务入口 | nop-runner/nop-cli-core/tasks/gen-web.xrun |
.xgen |
生成阶段模板 | nop-wf/nop-wf-web/precompile/gen-page.xgen |
最常见的基础语法
文本输出模板
<c:unit xpl:outputMode="text">
...
</c:unit>
这表示模板输出的是文本,而不是普通 XML 树。
循环
<c:for var="item" items="${items}">
...
</c:for>
条件
<c:if test="${condition}">
...
</c:if>
表达式
${model.name}
XLang 表达式支持 ===/!== 严格相等运算符,语义与 ==/!= 相同(均不进行类型转换),与 JavaScript/TypeScript 语法兼容。
内联脚本
<c:script>
...
</c:script>
通过 XLib 调用
<run:GenWithCache xpl:lib="/nop/codegen/xlib/run.xlib" .../>
仓库里的真实参考
nop-wf/nop-wf-web/src/main/resources/_vfs/nop/wf/xlib/dingflow-gen/impl_GenComponents.xpl这里可以看到c:unit、c:for、c:if、${...}、c:script。nop-task/nop-task-core/src/main/resources/_vfs/nop/task/xlib/task.xlib这里可以看到xpl:is这类动态标签用法。nop-runner/nop-cli-core/tasks/gen-web.xrun这里可以看到xpl:lib调用 XLib 的入口模式。nop-kernel/nop-core/precompile/src/main/java/io/nop/core/type/PredefinedGenericTypes.java.xgen这里可以看到文本输出型.xgen模板。
schema 在哪里
常见 schema 位于:
nop-kernel/nop-xdefs/src/main/resources/_vfs/nop/schema/
最常用的几个:
xpl.xdefxlib.xdefxdsl.xdef
默认工作方式
- 先判断文件是
.xpl、.xlib、.xrun还是.xgen。 - 再看它是文本输出模板、可复用库,还是 runner 任务入口。
- 只在需要时去查对应 schema 和实现锚点。
- 如果任务只是追生成链路,不要把本页和
model -> codegen -> meta -> web链路文档混为一谈。
不要默认做的事
- 还没分清文件角色,就把所有 XLang 文件当成同一种 DSL。
- 一上来就大范围读源码,而不是先看真实模板例子和 schema。
- 把
.xgen的生成链路说明写回本页;那属于代码生成 runbook 的主题。
相关文档
./xdef-and-xdsl.md./model-first-development.md../03-runbooks/debug-codegen-and-generated-files.md../04-reference/source-anchors.md