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