【问题标题】:Gradle : Multiple subtasks share the same extension variable objectGradle:多个子任务共享同一个扩展变量对象
【发布时间】:2016-11-03 18:52:55
【问题描述】:

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

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

【问题讨论】:

    标签: java gradle groovy gradle-plugin gradle-custom-plugin


    【解决方案1】:

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

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

    或者也许更好的解决方案是将扩展对象全部删除,而是将env 属性(输入?)添加到DummyTask

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 2013-02-13
      • 2012-11-14
      • 2018-08-26
      • 1970-01-01
      • 2020-10-25
      相关资源
      最近更新 更多