【问题标题】:Dependencies for custom incremental Gradle compile task自定义增量 Gradle 编译任务的依赖项
【发布时间】: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。注意,我几乎需要编译模板了解这些信息,因为我需要解析它并确定它包含的所有位置,这些包含如何解析等。

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

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

【问题讨论】:

    标签: gradle gradle-dependencies gradle-task


    【解决方案1】:

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

    目前还没有这种可重复使用的机制。我们有增量 Java 的编译以及进一步开放它的想法已经到来 在内部向上。但据我所知,目前还没有具体的计划。

    我不完全清楚哪些对象在守护进程的内存中存活 无论如何运行之间

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

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多