Запускать задачу Gradle из пользовательского Java-плагина автоматически для всех модулей проекта. - PullRequest
0 голосов
/ 24 октября 2019

Я пишу пользовательский плагин Gradle на Java, и он, кажется, работает так, как я ожидаю, когда я явно вызываю задачу, которую он создает.

Теперь задача тесно связана с тестами, поэтому я хотел бы, чтобы она выполнялась автоматически при выполнении тестов (в идеале, перед тестами на самом деле), но у меня есть 2 проблемы. Ниже мой плагин:

public class MyCustomGradlePlugin implements Plugin<Project> {

    public void apply(Project project) {
        MyCustomGradleConfig myCustomGradleConfig = project.getExtensions().create("myCustomGradleExtension", MyCustomGradleConfig.class, project);

        Task myCustomTask=project.getTasks().create("checkRules", MyCustomRulesTask.class, myCustomGradleConfig);

        archUnitTask.setGroup("verification");
        project.getTasks().findByName("test").dependsOn(myCustomTask);
    }
}

Я собираю и внедряю локально этот плагин. Когда я объявляю и настраиваю его в build.gradle в корне многомодульного проекта:

  • , если я забуду применить плагин Java в проекте, тогда задача «тестирования»не существует, и myCustomTask не может быть «присоединен» к нему: есть ли способ убедиться, что плагин java объявлен при выполнении MyCustomGradlePlugin?

  • ´myCustomTask´ выполняется, но только в корне проекта, где нет ничего интересного: если проект представляет собой многомодульный проект, его нужно выполнить для всех модулей,В идеале мне бы хотелось, чтобы плагин позаботился об этом, чтобы максимально упростить настройку в проектах, которые будут его использовать. Как мне этого добиться?

1 Ответ

1 голос
/ 24 октября 2019

есть ли способ убедиться, что плагин Java объявлен при выполнении MyCustomGradlePlugin?

Да. Вы можете применить плагин Java в своем собственном плагине следующим образом:

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

Или вы можете условно добавить свою задачу, если плагин Java существует так:

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

если проект является много-модульным проектом, мне нужно, чтобы он выполнялся для всех модулей.

Этого можно добиться, просто применив свой плагин к каждому отдельному подпроекту, например, с помощьюallprojects метод:

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

Кроме того, вы также можете заключить весь код вашего плагина в блок allprojects. В этом случае, с точки зрения пользователя, они применяют ваш собственный плагин к корню, и он будет сам настраиваться для всех подпроектов.

...