是project.afterEvaluate访问插件配置以创建任务的正确方法

问题描述 投票:0回答:1

背景

我目前正在编写一个插件,它使用一些配置,然后根据该配置创建可变数量的任务。下面是它的简化版本

配置示例:

public class TypedMaterialsExtension{

    private Property<Boolean> createTheTask;

    public TypedMaterialsExtension(Project project) {
        createTheTask = project.getObjects().property(Boolean.class);
        createTheTask.set(false);
    }

    public Property<Boolean> getCreateTheTask() {
        return createTheTask;
    }

}

在build.gradle中使用:

typedMaterials{
  createTheTask = true
}

示例插件

public class TypedMaterialsPlugin implements Plugin<Project> {
    public void apply(Project project) {

        TypedMaterialsExtension extension = project.getExtensions().create("typedMaterials", TypedMaterialsExtension.class, project);

        if(extension.getCreateTheTask().get()){
                project.getTasks().register("beforeTask", TypedJarMaterials.class, task -> {});
            project.getTasks().named("compileJava").configure(compileJava -> {
                compileJava.dependsOn("beforeTask");
            });
        }

        project.afterEvaluate(p -> {
            if(extension.getCreateTheTask().get()){
                project.getTasks().register("afterTask", TypedJarMaterials.class, task -> {});
                project.getTasks().named("compileJava").configure(compileJava -> {
                    compileJava.dependsOn("afterTask");
                });
            }
        });
    }
}

afterTask
已注册
beforeTask
未注册

问题

我发现该配置仅在项目内访问时可用。afterEvaluate lambda。在示例中,

afterTask
已注册,但
beforeTask
未注册。显然,我可以将所有内容放在
project.afterEvaluate
块内,但我知道这是不好的做法。我应该做什么来根据某些配置有条件地创建任务?

java gradle gradle-plugin
1个回答
0
投票

不要使用属性,而使用函数。

public class TypedMaterialsExtension {

    private final Project project;

    public TypedMaterialsExtension(Project project) {
        this.project = project;
    }

    public void createTheTask() {
        project.getTasks().register("timelyTask", Task.class, task -> {});
        project.getTasks().named("compileJava").configure(compileJava -> {
            compileJava.dependsOn("timelyTask");
        });
    }

}

build.gradle

typedMaterials {
    createTheTask()
}

然后,添加任务的代码会随着构建脚本的执行而运行。

属性对于修改某物的配置更有用,而不是(如本问题中)对象是否存在的二元问题;一旦对象存在,您就可以使用 Gradle 的惰性 API 来获取属性值。

© www.soinside.com 2019 - 2024. All rights reserved.