Пользовательский тип задачи не найден при импорте плагина Gradle - PullRequest
0 голосов
/ 10 октября 2019

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

Код моего кода плагина следующий:

public class TaskSpawnerPlugin implements Plugin<Project> {

    void apply(Project project) {
        project.task('spawnTask', type: TaskSpawner)
    }

}

И это задача, о которой идет речь:

public class TaskSpawner extends DefaultTask {

    @Input
    String command

    @Input
    String ready

    @Input
    String workDir = '.'

    TaskSpawner() {
        description = 'Given a Unix like cmd, this will start it and let it run on the background'
    }

    @TaskAction
    public void spawn() {
        getLogger().quiet "Attempting to run provided command $command"
        if (!(command && ready)) {
            throw new GradleException("Please make sure that both the command and ready check are provided!")
        }
        waitFor(createProcess(workDir, command))
    }

    private def waitFor(Process process) {
        new BufferedReader(new InputStreamReader(process.getInputStream())).withCloseable {
            reader ->
                def line
                while ((line = reader.readLine()) != null) {
                    getLogger().quiet line
                    if (line.contains(ready)) {
                        getLogger().quiet "$command is ready"
                        break
                    }
                }
        }
    }

    private def static createProcess(String directory, String command) {
        new ProcessBuilder(command.split(' '))
                .redirectErrorStream(true)
                .directory(Paths.get(directory).toFile())
                .redirectError(ProcessBuilder.Redirect.INHERIT)
                .redirectInput(ProcessBuilder.Redirect.INHERIT)
                .redirectOutput(ProcessBuilder.Redirect.INHERIT)
                .start()
    }

}

Код находится в структуре пакета со следующим именем пакета

fts.gradle

Мой скрипт сборки выглядит следующим образом:

plugins {
    id 'java-gradle-plugin'
    id 'groovy'
    id 'maven-publish'
}

group =  'fts.gradle'
version = '0.3'

repositories {
    jcenter()
}

dependencies {
    compile gradleApi()
    compile localGroovy()
}

gradlePlugin {
    plugins {
        greetingsPlugin  {
            id = 'fts.gradle.taskspawn'
            implementationClass = 'fts.gradle.TaskSpawnerPlugin'
        }
    }
}

Я обычно собираю свой плагин и размещаю его на локально размещенной артефакте. Моя проблема вращается вокруг того, как импортировать его и использовать в проекте.

В настоящее время я делаю следующее:

buildscript {
    repositories {
        maven { url "<maven_url>" }
    }
    dependencies {
        classpath group: 'fts.gradle', name: 'task-spawner', version: '0.3'
    }
}

plugins {
    id 'java'
    id 'application'
    id 'eclipse'
}

apply plugin: 'fts.gradle'

И затем я пытаюсь применить его, используя следующее:

Но при попытке обновить проект это действие завершается неудачно:

* What went wrong:
A problem occurred evaluating project ':integration-tests'.
> Could not get unknown property 'TaskSpawner' for project ':integration-tests' of type org.gradle.api.Project.

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

Может кто-нибудь, пожалуйста, пролить немного света здесь? В последние дни это сводило с ума.

Обратите внимание, для справки версия Gradle, которую я использую 5.6.2

...