Gradle: несколько подзадач имеют один и тот же объект переменной расширения

Я создал собственный плагин Gradle, как это,

DummyPlugin.java

public class DummyPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {
        project.getTasks().create("dummy", DummyTask.class);
        project.getExtensions().create("dummy", DummyExtension.class);
    }
}

DummyTask.java

public class DummyTask extends Test {
    @TaskAction
    public void dummy() {
        Project project = getProject();
        DummyExtension extension = project.getExtensions().findByType(DummyExtension.class);
        System.out.println("Env of dummy is " + extension.getEnv());
    }
}

DummyExtension.java

public class DummyExtension {
    private String env;

    public String getEnv() {
        return env;
    }

    public void setEnv(String env) {
        this.env = env;
    }
}

Теперь я создал три задачи для разных сред, например:

apply plugin: 'dummy'

task dummyCI(type: DummyTask) {
    dummy {
        env = 'ci'
    }
}

task dummyDev(type: DummyTask) {
    dummy {
        env = 'dev'
    }
}

task dummyTest(type: DummyTask) {
    dummy {
        env = 'test'
    }
}

Но, на ходу ./gradlew dummyCIвместо того, чтобы получать Env of dummy is ci, Я собираюсь Env of dummy is test, То же самое для ./gradlew dummyDev также.

Как мне исправить эту проблему? Благодарю.

1 ответ

Решение

Вы устанавливаете свойство extension на этапе настройки, который всегда выполняется. Таким образом, каждый вызов отменяет предыдущий. Чтобы установить его на этапе выполнения, используйте doFirst { ... } блок. Например:

task dummyCI(type: DummyTask) {
    doFirst {
        dummy {
            env = 'ci'
        }
    }
}

Или, возможно, лучшим решением будет избавиться от объекта расширения все вместе и вместо этого добавить env свойство (вход?) для DummyTask

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