DreamFXLang
工具链

ci.ps1 与门禁

四步 CI 各自抓什么、参数怎么选、文档漂移检查,以及一条能放进流水线的最小配置。

pwsh -File Plugins/DreamFX/.skill/ci.ps1

一条命令,四步,顺序是「最快失败的先跑」:

lint -All

只读源码,不碰资产,所以它失败得最快。抓:GPU emitter 没 bounds、按速率生成没有上限、 用了随机没设种子、renderer 没有材质。

build -All -Force

每个 .dfs / .dfm 都生成,且 Niagara 编译干净。-Force 是关键 —— 门禁不能因为 「hash 没变」而跳过任何东西。

verify -All

每个生成资产上的戳都与它的源码匹配。这一步抓的是没人会注意的那件事:有人改了 .dfs、 没重建、把两个都提交了。单跑 build 会通过,因为 build 会把它修好。

corpus

Tests/Corpus 套件:按码与位置比对诊断、黄金拓扑、反编译幂等。它抓的是行为变了而不是坏了。

退出码 0 表示四步全过,否则是第一个失败步骤的码。

第 4 步为什么值得付这个时间:DreamFX 关于 Niagara 的几乎每一条知识都是实验得来的, 不是某个类型系统保证的。语料就是让这些知识里任何一条悄悄变化时会失败的那个东西。

参数

参数用在什么场合
-SkipBuild只检查,不允许写工作树的门禁。verify 随后会报出所有没被建过的源码
-SkipCorpus本地快速检查。不要用在门禁上 —— 语料要 boot 编辑器,比另外三步加起来还贵,跳过它就等于跳过了行为回归
-CleanNew删掉构建新建的资产,让门禁不留痕迹。此时 verify 会被跳过(它要检查的资产刚被故意删掉了)
-Project / -Engine显式指定项目与引擎根

关着编辑器跑。 第 2 步和第 4 步写 .uasset,编辑器开着也在写同一批。谁后存谁赢, 两边都不吭声。

文档不许漂移

pwsh -File Plugins/DreamFX/.skill/gen-diagnostics.ps1 -Check

诊断文档的一半是机器写的:扫源码里的 Diagnostics.Error/Warning/Info(TEXT("DFXnnnn"), ...),按千位段一页,每个码一节, 写下它的严重级别、消息模板和抛出位置。人写的那一半 —— 成因与修法 —— 原样保留。

-Check 把它变成门:文档过期就 exit 1。这就是 CI 怎么发现「有人加了一个码但没人写它」。

这样切分的理由很直接:会腐烂的那一半(有哪些码、它们说什么)被重新生成, 不会腐烂的那一半(为什么会发生)只写一次。

一个最小流水线

# 概念示意:任何 CI 都是这四步 + 一个文档门
steps:
  - run: pwsh -File Plugins/DreamFX/.skill/gen-diagnostics.ps1 -Check
  - run: pwsh -File Plugins/DreamFX/.skill/ci.ps1

跑之前要有:Windows 机器、能解析到的引擎(UE_ENGINE_ROOT 或注册好的 EngineAssociation)、和创作项目相同的内容插件集合,以及没有编辑器开着这个项目

更深的检查

这四步之外,还有几件事值得在发布轮而不是每次提交时跑:

dfx.ps1 verify -All -StrictVersions   # 模块版本漂移视为错误
dfx.ps1 mirror-diff                    # L1 文本 + L2 编译
dfx.ps1 asset-diff                     # 资产事实,绕开导出器
dfx.ps1 coverage                       # 覆盖率分桶

往返与等价

本页目录