【问题标题】:Custom Gradle Plugin executed only once in Multiproject build自定义 Gradle 插件在多项目构建中仅执行一次
【发布时间】:2019-02-06 14:56:37
【问题描述】:

我用 Java 编写了一个 gradle 插件,我想在多项目 gradle 设置中使用它。插件自带的任务只执行一次,不明白为什么。

项目结构如下:

Root project
     |- settings.gradle
     |- build.gradle
     |- project1
     |     |- build.gradle
     |- project2
     |     |- build.gradle
     |- project3
     |     |- build.gradle
     ...

根 build.gradle 看起来像这样

buildscript {
repositories {
    jcenter()
    maven { url "https://repo.spring.io/plugins-snapshot" }
    maven { url "https://repo.spring.io/plugins-release" }

    maven{
        url = "https://my-personal-nexus.de/content/repositories/release/"
    }
    ....
    dependencies {
       ....
       classpath "de.mystuff:myCustomPlugin:1.0.0"
    }
  }
}
subprojects {
   apply plugin: "myCustomPlugin"
   ....
}

插件“myCustomPlugin”提供了一个名为 myTask 的任务。由于插件应用于 build.gradle 的子项目部分,我假设当我调用时:

./gradlew myTask

将为 project1、project2、project3 执行任务。

实际上,该任务仅在 project1 中执行,而不在 project2 或 project3 中执行。如果我打电话

./gradlew -p "project2" myTask

任务在项目 2 中执行得很好。 关于为什么没有为每个子项目执行任务的任何提示?

当我打电话时

 ./gradlew tasks --all

结果显示每个子项目的任务。

谢谢!

编辑:

任务的插件代码:

public class MyGeneratorTask extends DefaultTask {

@TaskAction
public void genMyCode() throws Exception {
        MyGeneratorExtension extension = getProject().getExtensions().getByType(MyGeneratorExtension.class);
        MyGeneratorConfig.setPath(extension.getPath());
        MyGeneratorConfig.setGendir(extension.getGendir());
        MyCodeGeneratorApplication.generateMyClasses();
    }
}

以及插件定义本身:

public class MyPlugin implements Plugin<Project> {
    static final String GEN_TASK_CONFIG = "myConfig";
    static final String GEN_TASK_NAME = "myTask";

    @Override
    public void apply(Project target) {
        target.getExtensions().add(GEN_TASK_CONFIG, MyGeneratorExtension.class);
        target.getTasks().create(GEN_TASK_NAME, MyGeneratorTask.class);
    }
}

以及扩展的代码:

import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@EqualsAndHashCode(callSuper = false)
public class MyGeneratorExtension {

   private String path;
   private String gendir;

}

【问题讨论】:

  • 你猜对了:当调用./gradlew myTask Gradle 应该调用你所有子项目的任务。您能否分享您创建myTask 任务以及将此任务添加到项目中的插件脚本部分?
  • 我添加了代码,谢谢
  • 你创建扩展的方式和子项目上的任务是正确的,我在这里看不出有什么问题..当你执行./gradlew myTask时,Gradle的输出日志是什么?您是否看到 myTask 对于其他子项目(“project1”除外)是“SKIPPED”,或者对于其他子项目根本没有日志?
  • 输出是:在 1 秒内构建成功 1 个可操作的任务:1 个已执行。我还使用 --console=plain 查看了已执行的任务。这些任务不会被跳过,但从未被调用。我一无所知

标签: java gradle build.gradle gradle-plugin


【解决方案1】:

解决方案:

似乎gradle不喜欢在Task中调用静态方法。 在我切换到类初始化后,它起作用了。

感谢@M.Ricciuti

【讨论】:

  • 奇怪的是,我已经尝试过您的解决方案(使用静态字段/方法的 MyGeneratorConfigMyCodeGeneratorApplication 的简单实现复制粘贴您的代码),它对我来说很好...
  • 这确实很奇怪。
猜你喜欢
  • 2020-12-26
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 2018-08-30
相关资源
最近更新 更多