【发布时间】:2016-03-01 19:10:15
【问题描述】:
如果希望我的编译任务是增量的,我想知道使用具有传递依赖关系的文件管理自定义编译步骤的最佳方法。这是具体的用例:我有一个充满模板的目录(在这种情况下为车把模板)。假设这些位于pages 目录中。其中一些模板包括其他模板(Handlebars partials)。假设包含的模板在includes 中。编译所有模板相当容易。例如,我可以使用像handlebars <input-file> 这样的handlebars 命令来编译pages 中的每个文件(例如for (File file : srcDir) { project.exec { commandLine 'handlebars', file.name }}。
当调用 handlebars 命令时,会编译 input-file 并在必要时提取 input-file 包含的任何模板,以及任何包含的模板,包括 add 等。无需赘述,我也可以学习完整集编译模板时的传递依赖关系。因此,例如,如果模板 A 包含 B 和 C,并且 B 在编译 A 的过程中包含 E,我将了解到如果 B、C 或 E 发生更改,我需要重新编译 A。注意,我几乎需要编译模板了解这些信息,因为我需要解析它并确定它包含的所有位置,这些包含如何解析等。
我想创建一个自定义的增量任务来编译文件,但仅限于必要时。我知道如何声明此任务的输入,并且我知道如何在内存中维护从包含目录中的文件到直接或传递依赖它的页面中的模板的映射。因此,如果 IncrementalTaskInputs.outOfDate 包括,例如,includes/E,我知道我需要重新编译 A。到目前为止一切都很好,但我不清楚使其实际工作的最佳方法。
显然,仅将依赖项存储在内存中是行不通的,因为守护进程可能会重新启动或什至可能不会运行(而且我并不完全清楚哪些对象在运行之间的守护进程中仍然存在于内存中)。据我了解,Gradle 维护某种缓存,因此它能够计算正确的 IncrementalTaskInputs 并知道,例如,自上次运行以来仅包含/E 更改。因此,我不知何故需要维护一个依赖项缓存,以便在必要时从磁盘中读取。我可以通过将它们写入文件来手动执行此操作,但这似乎很容易出错。例如,不合时宜的 Ctrl-C 可能会使我的缓存与 Gradle 的缓存过时。我猜有一个内置系统允许我简单地声明依赖项并让 Gradle 负责将其与它自己的缓存一起保存。或者更好的是,也许有一个现有的基类可以处理这种事情,而我所要做的就是声明依赖关系是什么?有这种事吗?
【问题讨论】:
标签: gradle gradle-dependencies gradle-task