编写Gradle插件时,如何让自定义任务始终在check阶段执行?
解决Gradle插件中自定义任务自动绑定到check阶段的问题
我明白你遇到的问题了——你想让自定义的myTask在插件应用时自动成为check任务的依赖,但直接查找check任务的代码没生效,这大概率是因为Gradle任务的懒加载特性导致的。
问题根源
你当前的代码里用tasks.findByPath("check")直接查找任务,但很多时候check任务(比如Java插件提供的默认check任务)是在你的插件代码执行之后才被创建的。这时候你的代码执行时check任务还不存在,findByPath返回null,自然没法添加依赖关系。
正确解决方案:使用懒加载的任务配置
Gradle提供了tasks.named()方法来处理这种场景,它会注册一个延迟执行的配置动作,只有当check任务被实际创建出来之后,才会执行添加依赖的逻辑。
如果你用Groovy编写插件:
TaskContainer tasks = project.tasks MyTask myTask = tasks.create(TASK_NAME, MyTask) // 替换原来的findByPath逻辑 tasks.named('check') { checkTask -> checkTask.dependsOn(myTask) }
如果你用Java编写插件:
TaskContainer tasks = project.getTasks(); MyTask myTask = tasks.create(TASK_NAME, MyTask.class); // 用named+configure实现懒加载配置 tasks.named("check", Task.class).configure(checkTask -> { checkTask.dependsOn(myTask); });
额外说明
如果你的插件需要确保check任务一定存在(比如插件只针对Java项目),可以在插件里主动应用Java插件,这样check任务一定会被创建:
// Groovy示例 project.pluginManager.apply('java')
这样就不用担心check任务不存在的情况了。
验证效果
现在当你把插件应用到项目中,执行gradle check时,myTask会自动作为check的前置任务被执行,完全不需要项目侧手动添加dependsOn配置。
内容的提问来源于stack exchange,提问作者Florian
相关产品推荐
相关产品推荐

