我目前正在编写一个插件,它使用一些配置,然后根据该配置创建可变数量的任务。下面是它的简化版本
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
块内,但我知道这是不好的做法。我应该做什么来根据某些配置有条件地创建任务?
不要使用属性,而使用函数。
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 来获取属性值。