Пользовательский плагин Gradle зависит от системной задачи

У меня есть собственный плагин под названием MyPlugin, и он содержит пользовательскую задачу под названием MyTask. Я хочу сделать MyTask зависимым от compileJava. Я пытался дать MyTask.dependsOn(compileJava), но там написано Task called 'MyTask' is not existing. Есть ли способ сделать это?

MyPlugin.java

public class MyPlugin implements Plugin<Project> {
    public static final String TASK_NAME = "MyTask";

    @Override
    public void apply(Project project) {
        project.getExtensions().create(TASK_NAME, MyExtension.class);
        project.getTasks().create(TASK_NAME, MyTask.class);
    }
}

MyTask.java

public class MyTask extends DefaultTask {
    private MyExtension extension;

    @TaskAction
    public void myTask() {
        Project project = getProject();
        extension = project.getExtensions().findByType(MyExtension.class);
        PropertyManager propertyManager = new PropertyManager(project, extension);
        propertyManager.setProperties();
        System.out.println(extension.getValue());
    }

MyExtension.java

public class MyExtension {
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

build.gradle

apply plugin: 'maven'
apply plugin: 'groovy'
apply plugin: 'java'
apply plugin: 'com.jfrog.bintray'

sourceCompatibility = 1.8

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile gradleApi()
}

repositories {
    mavenCentral()
}

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
    }
}

task copyLibs(type: Copy) {
    from configurations.runtime
    into "$projectDir/libs"
}

MyTask.dependsOn(copyLibs)  //not working
MyTask.dependsOn(compileJava)   //not working

person Msp    schedule 05.04.2016    source источник
comment
Не могли бы вы добавить build.gradle файл, где вы применяете плагин и настраиваете задачу?   -  person Michael    schedule 05.04.2016


Ответы (3)


Вы должны использовать

tasks.MyTask.dependsOn(copyLibs) 
tasks.MyTask.dependsOn(compileJava)

потому что объект задачи, который вы определили, не находится в текущей области, такой как copyLibs. Но вы можете получить к нему доступ через справочник по задачам (см.: https://docs.gradle.org/current/dsl/org.gradle.api.Project.html)

person and_dev    schedule 06.04.2016

Если ваш плагин Gradle применяется к другому проекту Gradle, скажем, к проекту A, ваш плагин добавляет задачу MyTask в проект A. Вышеупомянутый build.gradle предназначен для проекта плагина и не имеет задачи MyTask.

person RaGe    schedule 05.04.2016

Насколько я понимаю, ваша задача называется myTask, а не MyTask. Опечатка в авторском коде.

ОБНОВЛЕНИЕ:

Вы не применяете свой плагин, поэтому задача не создается. И вы не можете применить плагин из build.gradle плагина. По крайней мере, вы не можете применить версию собираемого плагина. Лучшее, что вы можете сделать, это применить ранее созданную версию плагина, которая хранится в репозитории Maven. Но это не похоже на хорошую идею.

person Michael    schedule 05.04.2016
comment
Неа. На самом деле это была опечатка. Название моей задачи в MyTask - person Msp; 05.04.2016
comment
Вы собираетесь исправить это в своем вопросе? - person Michael; 05.04.2016
comment
я внес изменения - person Msp; 05.04.2016
comment
Добавил еще одну гипотезу к ответу. - person Michael; 05.04.2016
comment
Это build.gradle проекта плагина. - person Msp; 05.04.2016
comment
Но плагин не применяется. Вам все равно придется применять его вручную. Если вы хотите просто создать задачу, вам не нужен плагин. - person Michael; 05.04.2016
comment
Должен ли я применять свой плагин сам по себе? Как мне быть? - person Msp; 05.04.2016
comment
Я не уверен, что вы можете это сделать, потому что build.gradle выполняется до компиляции вашего плагина. Но вы можете использовать свой плагин при сборке через зависимость от Maven. Но это очень опасный способ :) - person Michael; 05.04.2016