首页 > 解决方案 > gradle 任务如何显式设置自己已更改其输出或更新依赖于它的任务

问题描述

我正在创建一个相当自定义的任务,该任务处理多个输入文件并输出不同数量的输出文件。

我想根据现有的输出文件检查输入文件的日期,并且还可能查看输入文件的内容以确定它是最新的还是需要调用以成为最新的。我需要在 doFirst 中设置哪些属性,对主要操作或任务中的任何内容(何时何地)进行编码,以便为其依赖项检查器和任务执行器设置正确的状态,以便适当地强制依赖项构建或不构建。

还有任何关于标准库实用程序的文档,用于执行文件日期检查等操作,获取文件列表等,这些操作很简单,就像在 ruby​​ rake 中一样。

如何指定任务的输入和输出?尤其是在解析源并扫描输出目录以查找存在的内容之前,不会知道输出。

在具有依赖于它的任务的较大项目中执行此操作的示例将非常好:)

标签: gradlebuild.gradle

解决方案


我需要在 doFirst 中设置哪些属性,对主要操作或任务中的任何内容(何时何地)进行编码,以便为其依赖项检查器和任务执行器设置正确的状态,以便适当地强制依赖项构建或不构建。

理想情况下,这应该作为自定义任务类型来完成。这些逻辑都不应该在任何 Gradle 文件中。要么将逻辑放在发布到某个地方的专用插件项目中,然后你可以在项目中引用它,要么将逻辑放在buildSrc.

您正在尝试开发的是所谓的增量任务:https ://docs.gradle.org/current/userguide/custom_tasks.html#incremental_tasks

这些在整个 Gradle 中大量使用,这使得 Gradle 的增量构建成为可能:https ://docs.gradle.org/current/userguide/more_about_tasks.html#sec:up_to_date_checks

如何指定任务的输入和输出?尤其是在解析源并扫描输出目录以查找存在的内容之前,不会知道输出。

一旦你定义了你的任务和你需要的任何其他东西,在你的主要 Gradle 文件中,你可以像配置任何其他插件或任务一样配置它们。

上面的两个链接应该足以帮助您入门。

作为一个小例子,我开发了一个 Gradle 插件,它基于一些在配置之前不知道的输入生成文件。“自定义”任务类型只是扩展了提供的JavaExec. 自定义任务是Wsdl2java. 然后根据用户配置,使用用户的输入文件在此处注册任务。由于我重用了内置任务类型,我确信不会做任何额外的工作,并且可以依靠 Gradle 来完成繁重的工作。还有一个测试可以确保配置缓存按预期工作:ConfigurationCacheFunctionalTests

正如我之前提到的,上面的链接应该足以让您入门。


推荐阅读