класс настраиваемых задач gradle делает себя некомпилируемым

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

В этом примере я назвал подпроекты "a" (для приложения) и "p" (для плагина, хотя я не использую объект плагина, а просто предоставляю класс задачи для сценария сборки).

settings.gradle

include 'p'
include 'a'

п /build.gradle

apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'maven-publish'

group 'test'
version '1.0'

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }
}

dependencies {
    implementation gradleApi()
    implementation localGroovy()
}

p / src / main / groovy / p / MyTask.groovy

package p

import org.gradle.api.DefaultTask;
import org.gradle.api.tasks.TaskAction;

class MyTask extends DefaultTask {
    @TaskAction
    void run() {
        System.out.println('yay!');
    }
}

а /build.gradle

buildscript {

    repositories {
        mavenLocal()
    }

    dependencies {
        classpath 'test:p:1.0'
    }

}

group = 'test'
version = '1.0'

apply plugin: 'java'

task myTask(type: p.MyTask) {
}

"Плагин" создается путем запуска внутри папки p:

../gradlew clean build publishToMavenLocal

Внутри папки:

../gradlew myTask

печатает "ура!"

Однако в процессе разработки случаются ошибки. Когда я моделирую ошибку в MyTask:

MyTask() {
    throw new RuntimeException("an error");
}

и соберите плагин (в папке p):

../gradlew clean build publishToMavenLocal

он терпит неудачу, как и ожидалось.

Теперь я "исправляю" ошибку, снова удаляя сломанный конструктор и собираю заново в папке p:

../gradlew clean build publishToMavenLocal

но эта команда не работает с той же ошибкой.

Насколько я понимаю, причина в том, что:

  • сломанный плагин находится в моем локальном репозитории maven
  • при попытке собрать плагин обнаруживает settings.gradle в родительской папке
  • gradle пытается настроить все проекты, на которые есть ссылки из settings.gradle
  • это загружает сломанный плагин
  • сборка не удалась

Для проверки я закомментировал строку include для a в settings.gradle, и она снова работает. Вернул settings.gradle, и он все еще работает, потому что теперь "фиксированный" плагин находится в моем репозитории maven, и при повторной сборке плагина он просто перезапишет его снова с рабочей версией.

Суть в том, что ошибки в моем настраиваемом классе задач (или настраиваемом плагине, или любом другом коде сценария сборки) могут сделать себя некомпилируемыми, а обходным путем является редактирование или временное переименование settings.gradle. Чем сложнее становится проект, тем громоздче это становится: переименование не работает, если сам код плагина содержит несколько подпроектов, и даже комментирование превращается в "комментирование правильных строк".

Как предполагается решить эту проблему?

1 ответ

Решение

Сложную логику для одиночного (много-) проекта лучше всего организовать в buildSrc. Вы можете по большей части рассматривать его как обычный подпроект, но вместо этого только для пути к классам сборки. Плагины и задачи, которые вы создаете здесь, автоматически доступны для всех проектов в мультипроекте.

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

Другие вопросы по тегам