Gradle1.12/2.0自定义插件TaskConfigPlugin扩展值为空如何解决
核心问题原因
你遇到的空值问题是Gradle配置阶段的执行顺序导致的:
- 执行
apply plugin: 'TaskConfigPlugin'时,会先运行插件apply方法的全部代码,此时你脚本里的taskOrder {}配置块还没执行,扩展属性全是默认的null - 如果你之前用
afterEvaluate不生效,大概率是你还是在apply阶段就提前读取了扩展属性存到成员变量,没有在afterEvaluate回调中实时读取扩展的最新值。
Gradle 1.12 兼容解决方案
把所有依赖扩展属性的逻辑全部挪到project.afterEvaluate回调中执行,不要在apply方法中提前读取扩展值,修改后的插件代码如下:
import org.gradle.api.Action; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.Task; public class TaskConfigPlugin implements Plugin<Project> { @Override public void apply(Project project) { final TaskConfigPluginExtension extension = project.getExtensions() .create("taskOrder", TaskConfigPluginExtension.class); // 所有用到扩展属性的逻辑全放到afterEvaluate回调中 project.afterEvaluate(new Action<Project>() { @Override public void execute(Project p) { // 在这里才读取扩展属性,此时taskOrder配置块已经执行完成,值已经被赋值 String taskPrefix = extension.getTaskPrefix(); Task mainTask = extension.getMainTask(); configureTaskOrdering(p, taskPrefix, mainTask); } }); } private void configureTaskOrdering(Project project, String taskPrefix, Task mainTask){ // 判空逻辑自己加,防止用户没配置就运行 if (taskPrefix == null || mainTask == null) { project.getLogger().warn("taskOrder扩展未配置完整,任务排序逻辑跳过"); return; } // 原来的任务排序逻辑不变,用传入的taskPrefix和mainTask即可 } }
补充说明
- 这个方案不需要依赖高版本的Provider/Property API,完全兼容Gradle 1.12/2.0版本
afterEvaluate回调会在整个项目配置阶段全部完成后执行,此时不仅扩展的配置值已经写入,脚本中定义的mainConsumer任务也已经创建完成,不会出现任务引用无效的问题
内容的提问来源于stack exchange,提问作者SkyeBoniwell
相关产品推荐
相关产品推荐

