Skip to content

术语分册 6:驱动与跟踪

这一册负责解释“生成器到底生成了什么”“哪一步重新跑了”“增量组合对象怎么理解”。

GeneratorDriver

  • 一句话说明:运行生成器并读取运行结果的驱动对象
  • 什么时候会用到:测试里手工驱动生成器,或深入查看运行结果时
  • 对应教程:第 12 章

关键成员:

成员能拿到什么
RunGeneratorsAndUpdateCompilation(...)运行生成器并更新编译
RunGenerators(...)仅运行生成器
GetRunResult()查看本次运行的详细报告

GetRunResult()

  • 一句话说明:获取一次驱动运行的总结果
  • 什么时候会用到:你不只想看最终语法树,还想知道归因和分生成器结果时

GeneratorDriverRunResult

  • 一句话说明:一次驱动运行的总报告
  • 什么时候会用到:你要看这次总共生成了哪些树、有哪些诊断、每个生成器各自产出了什么

关键成员:

成员能拿到什么
GeneratedTrees本次总共生成的语法树
Diagnostics本次总诊断
Results每个生成器各自的结果

GeneratorRunResult

  • 一句话说明:单个生成器的运行结果
  • 什么时候会用到:你要只分析某个生成器本身

关键成员:

成员能拿到什么
GeneratedSources这个生成器生成的源码列表
Diagnostics这个生成器自己的诊断
Exception这个生成器是否抛异常
TrackedSteps普通增量步骤的跟踪信息
TrackedOutputSteps输出步骤的跟踪信息

GeneratedSourceResult

  • 一句话说明:单条生成源码的结果对象
  • 什么时候会用到:你想知道某条源码的 HintName、文本和语法树时

关键成员:

成员能拿到什么
HintName提示名
SourceText源码文本
SyntaxTree对应语法树

IncrementalValuesProvider<T>

  • 一句话说明:表示“多项结果流”的增量 provider
  • 什么时候会用到:你的筛选会产生多个目标时

Collect(...)

  • 一句话说明:把多项结果收集成集合
  • 什么时候会用到:你后续需要一次性看所有输入时

Combine(...)

  • 一句话说明:把两个输入源组合成一个新输入
  • 什么时候会用到:你需要同时拿“目标集合 + 编译对象”或“附加文件 + 配置”时

WithComparer(...)

  • 一句话说明:自定义 provider 的变化比较规则
  • 什么时候会用到:默认比较不够精确,导致不必要重算时

WithTrackingName(...)

  • 一句话说明:给某个增量步骤命名,方便跟踪和调试
  • 什么时候会用到:你要看“哪一步重跑了”
  • 对应教程:第 12 章

关键点:

你需要知道什么说明
它单独够不够不够,还需要驱动打开跟踪选项
它解决什么问题让步骤结果在 TrackedSteps 里有稳定名字

GeneratorDriverOptions

  • 一句话说明:配置驱动行为的对象
  • 什么时候会用到:你要打开增量步骤跟踪时

最常见的关注点:

选项作用
trackIncrementalGeneratorSteps是否记录步骤跟踪信息

IncrementalGeneratorRunStep

  • 一句话说明:某个被跟踪步骤的一次运行记录
  • 什么时候会用到:你要看这一步耗时多久、输入输出是什么

关键成员:

成员能拿到什么
Name步骤名
ElapsedTime耗时
Inputs上游输入
Outputs本次输出及运行原因

IncrementalStepRunReason

  • 一句话说明:描述这次输出为什么产生
  • 什么时候会用到:你要判断是新值、修改、未变还是缓存命中

常见值:

成员说明
New新产生
Modified已修改
Unchanged未变化
Cached直接命中缓存
Removed已移除

最常见的跟踪链路

csharp
var trackedProvider = provider.WithTrackingName("MyStep");
var runResult = driver.GetRunResult();
var trackedSteps = runResult.Results[0].TrackedSteps;

下一步去哪里

基于当前仓库文档副本构建的 VitePress 站点