自定义增量Gradle编译任务的依赖关系

时间:2016-03-01 19:10:16

标签: gradle gradle-dependencies gradle-task

我想知道如果希望我的编译任务是增量的,那么使用具有传递依赖性的文件来管理自定义编译步骤的最佳方法。这是具体的用例:我有一个充满模板的目录(在这种情况下是把手模板)。可以说这些都在pages目录中。其中一些模板包括其他模板(Handlebars partials)。可以说包含的模板位于includes。编译所有模板非常简单。例如,我可以使用handlebars <input-file>之类的句柄命令来编译pages中的每个文件(例如for (File file : srcDir) { project.exec { commandLine 'handlebars', file.name }}。

调用时,handlebars命令会编译input-file,并在必要时提取任何模板input-file包含的内容,以及包括添加内容等在内的任何内容。如果不进入不必要的细节,我也可以在编译模板时,学习模板的全部传递依赖项。因此,例如,如果模板A包含B和C,并且B在编译过程中包含E,AI将了解如果B,C或E更改我需要重新编译A.注意我几乎需要编译模板学习这些信息,因为我需要解析它并确定它包含的所有地方,包括解决方法等等。

我想创建一个编译文件的自定义增量任务,但仅限于必要时。我知道如何声明此任务的输入,我知道如何在内存中维护一个映射,从包含目录中的文件到直接或传递依赖它的页面中的模板。因此,如果IncrementalTask​​Inputs.outOfDate包括,例如,includes / E我知道我需要重新编译A.到目前为止一直很好,但我不清楚使其实际工作的最佳方法。

显然仅将依赖关系存储在内存中将不起作用,因为deamon可能重新启动或甚至可能不运行(并且我还不完全清楚哪些对象在运行之间的内存中仍然存在)。据我了解,Gradle维护某种缓存,因此它能够计算正确的IncrementalTask​​Inputs并知道,例如,自上次运行以来,只包含/ E已更改。所以我需要维护一个依赖关系的缓存,我可以在必要时读取磁盘。我可以通过将它们写入文件来手动完成,但这似乎容易出错。例如,一个不合时宜的Ctrl-C可能会使我的缓存与Gradle的缓存过期。我猜测有一个内置系统允许我简单地声明依赖关系并让Gradle负责保持它自己的缓存。或者更好的是,也许有一个现有的基类来处理这种事情,我所要做的就是声明依赖是什么?有这样的事吗?

1 个答案:

答案 0 :(得分:2)

我也在Gradle开发者列表中发布了这个。 Stefan Oehme回答了以下答案,我相信,这是正确的:

  

还没有这样的可重用机制。我们有增量   Java的编译以及进一步开放的想法已经到来   在内部。但是我还没有具体的计划。

     
    

我并不完全清楚哪些物体在一个守护神的记忆中存活下来     无论如何之间的运行

  
     

只要buildscript类路径没有改变,类就会存活   Gradle调用之间。重新创建实例(如项目)   但是,在每个构建上。所以作为第一枪,你可以存放东西   静态变量。如果缺少该状态,则执行完整构建。那   对于任何将守护进程与你的插件一起使用的人来说已经有很多帮助了。