从自定义Java插件自动触发项目的所有模块的Gradle任务

时间:2019-10-24 12:00:44

标签: java gradle gradle-plugin

我正在用Java编写自定义Gradle插件,当我显式调用它创建的任务时,它似乎可以按预期工作。

现在,任务与测试高度相关,因此我希望它在执行测试时自动执行(理想情况下,实际上在测试之前),但是我遇到了2个问题。以下是我的插件:

forEach()

我在本地构建和部署此插件。当我在多模块项目根目录的build.gradle中声明和配置它时:

  • 如果我忘记在项目中应用Java插件,则“ test”任务不存在,并且myCustomTask不能“附加”到该对象:有没有办法确保Java插件是MyCustomGradlePlugin执行时声明?

  • “ myCustomTask”执行,但仅在项目的根本没有什么有趣的地方执行:如果该项目是多模块项目,则需要它对所有模块执行。理想情况下,我希望插件可以处理它,以最大程度地简化将使用它的项目中的配置。我该如何实现?

1 个答案:

答案 0 :(得分:1)

  

有没有一种方法可以确保在MyCustomGradlePlugin执行时声明了Java插件?

是的。您可以像这样在自己的插件中应用Java插件:

project.getPlugins().apply(JavaPlugin.class)

或者,如果Java插件存在,则您可以有条件地添加任务,如下所示:

project.getPlugins().withType(JavaPlugin.class) {
    MyCustomGradleConfig myCustomGradleConfig = ...
}
  

如果该项目是一个多模块项目,我需要它对所有模块执行。

您可以通过简单地将插件应用于每个子项目来实现这一目标,例如通过allprojects方法:

allprojects {
    apply plugin: "your.plugin.id"
    myCustomGradleExtension {
        // ...
    }
}

或者,您也可以将所有插件代码包装在allprojects块中。在这种情况下,从用户的角度来看,他们将您自己的插件应用于根目录,它将为所有子项目进行配置。