xmlsquishsource. compose. build.
English

XML DSL 与项目指南

基于冻结的源码闭包构建

将 DSL 降低为 IR,优化编译期计算,链接引用单元,再由后端分发 prompt、pack 或 SOPack。

跳转到章节
本页目录

升级到 1.2.1:分清公共库与私有缓存

补丁修复完整文档、来源跟踪与资源指令的复用身份;相同空文档可以含有不同资源。SOPack 先完整验证再按引用选择预编译单元,未使用本地 XML 仍严格检查。公共命名空间、清单与 CLI 旗标不变。

重复文本共享内容,多片段拼接仍按需物化可见文本;来源、逻辑字节预算和诊断顺序保持独立。XML 和字符串参数无需改写。

失败诊断保留真正来源记录与实际调用链,库内位置不从默认头或提供者名猜测;现有错误码不变。

目录准备不为此重读派生 CAS 输出,但仍验证已发布文件。热 SOPack 证明须匹配本次冻结编码的摘要与大小;这不是热构建零 I/O 的承诺。

schema-1 读取契约接受既有 v1.2.0 SOPack;重写单一已重定位归档保留原有 _providers 名称及规范 bytes。输入归档与 SHA-256 锁定摘要保持不可变。新生产者可改进提供者指纹,因此跨版本重新生成不保证同一 bytes;这不意味着改写已有依赖。

私有缓存和动作配方身份可以升级并触发重建,不要手改 hash、SQLite 或内部路径。仅需要清理时使用现有 clean;离线重建需具备依赖输入。测量检查点已通过托管契约、站点与机制比较;精确发布提交随后通过主分支和六平台发布门禁,1.2.1 已稳定发布。有限场景结果不等于普遍加速。

pack:一起交付入口与资源

聚合编译后的入口与完整资源 bytes,输出可复现 ZIP 格式的 .pack。

<xs:pack xmlns:xs="https://xmlsquish.moesegfault.dev/ns">
  <xs:include path="instructions.xml" name="instructions.prompt"/>
  <xs:asset path="scripts/check.py" name="scripts/check.py"/>
</xs:pack>

include 只能指向 entry,不接受 module。asset 保存完整文件 bytes,不解析 XML、不压缩空白。name 可选;asset 默认保留相对路径,include 默认使用文件 stem 加 .prompt。

SOPack:库不是缓存,也不是成品

保存 IR、编译模块、宏、资源和元信息,不包含最终成品。

<xs:sopack xmlns:xs="https://xmlsquish.moesegfault.dev/ns">
  <xs:import src="macros.xml"/>
  <xs:asset path="schema.json"/>
</xs:sopack>

# xmlsquish.toml
[dependencies]
common = { sopack = "vendor/common.sopack" }

[target.library]
entry = "src/library.xml"
backend = "sopack"
output = "library.sopack"
xmlsquish add common --path vendor/common.sopack
xmlsquish remove common --dry-run

SOPack 不允许 include,包括宏正文。宏可以展开 asset,但资源路径属于定义源码;身份重定位后,跨设备展开依然取得正确 bytes。消费者按不可变依赖使用;不要在已有锁定身份下修改归档。

按需开启遥测与跟踪

跟踪(Tracing)默认关闭,没有默认记录或外发。summary 记录命令和阶段,events 额外记录生命周期事件与诊断。显式 off 覆盖环境变量。

xmlsquish --trace=summary build
xmlsquish --trace=events build
xmlsquish --trace=off build
# XMLSQUISH_TRACE=summary or events; bare --trace means events

记录持久保存在 <target-dir>/metadata/traces/<invocation>.jsonl,格式为 xmlsquish.trace.v1。开启 events 可能记录路径与诊断内容,分享前请审阅。日志写入失败只给出 TRACE001 警告,不改变操作结果。记录不是产品内容;升级时旧派生缓存可能失效,但项目依然拥有全部缓存。

构建管线

将 DSL 降低为 IR,优化编译期计算,链接引用单元,再由后端分发 prompt、pack 或 SOPack。

  1. 01front endDSL → IR
  2. 02middle endevaluate + optimize
  3. 03linkeraggregate + optimize
  4. 04backendprompt · pack · sopack

项目拥有完整构建根

默认 target-dir 是 target/xmlsquish。产品、可重建缓存与编译元数据一起移动;cache/ 与 metadata/ 由工具管理,不能依赖其中的散列、数据库或 journal 作为 API。

target/xmlsquish/
├── artifacts/              # *.prompt, *.pack, *.sopack, optional IR/debug outputs
├── cache/
│   ├── sources/            # locked dependency material
│   ├── cas/                # content-addressed build objects
│   └── actions.sqlite3     # rebuildable action index
├── metadata/
│   ├── layout.json         # private layout schema
│   ├── publications/       # publication + recovery records
│   └── catalog/            # compiler/build catalog
└── work/                   # disposable staging

xmlsquish clean 删除整个配置的 target-dir;下次构建从源码、清单和锁文件重建。离线构建只有在 cache/sources 仍有所需依赖时才能成功。

产物各自承担什么

后端输出 .prompt、.pack 或 .sopack,以及可选的 .xsir 中间表示和 .psdbg 溯源/调试证据。

.prompt

最终可消费产品。

.pack

聚合编译后的入口与完整资源 bytes,输出可复现 ZIP 格式的 .pack。

.sopack

保存 IR、编译模块、宏、资源和元信息,不包含最终成品。

.xsir

规范二进制中间表示。

.psdbg

溯源与调试映射。

为什么不只有 XSD

导入闭包、QName 符号、调用契约、递归预算与发布事务都是跨文件规则,由管理器统一验证。