класс настраиваемых задач 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, вы можете подумать о публикации стабильных выпусков плагина с номером версии, чтобы было легче откатиться.