Gradle : 多个子任务共享同一个扩展变量对象

Gradle : Multiple subtasks share the same extension variable object

我创建了一个像这样的自定义 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 也一样。

如何解决这个问题?谢谢。

您在始终运行的配置阶段设置扩展 属性。所以每次调用都会覆盖之前的调用。要在执行阶段设置它,请使用 doFirst { ... } 块。例如:

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

或者更好的解决方案是一起摆脱扩展对象,而是将 env 属性(输入?)添加到 DummyTask