构建中的计算与缓存[#82]

普通文章默认缓存求值后得到的Content IR。再次构建时,如果文章、导入的模块、编译代码和配置没有变化,就直接复用结果;上面的数学例子不必每次重新计算。整个Forest仍会重新分析,所以查询、链接和transclude能看到当前的文章集合。

不需要写cache key,也不需要手动增加版本号。修改代码或配置后,Grove根据输入指纹自动失效;grove check则始终重新求值和渲染,用于完整核验。

如果计算读取额外的数据文件,要在读取前登记它:

@use-modules[(grove input scribble) (ice-9 textual-ports)]
@(define data
   (call-with-input-file (depend-on! "data.txt") get-string-all))

depend-on!返回文件的绝对路径,并把文件内容登记为依赖。文件变化后,文章结果和渲染输出会一起失效,serve也会监视它。

对时间、随机数、网络请求,或者必须每次执行的副作用,应当主动退出缓存:

@use-modules[(grove input scribble)]
@(disable-cache!)

这样会在每次构建中重新执行这篇文章,也重新生成渲染输出。只因为一个结果可以保存,并不意味着任意Scheme程序都可以安全地跳过执行。

通用约定见构建阶段与缓存。