Gradle跨模块自定义任务执行顺序配置及依赖报错排查
首先得理清你遇到问题的根源:你用了**模块依赖(api project(":subproj2"))**来试图控制任务顺序,但这其实搞错了方向——模块依赖是用来让subproj1的代码能引用subproj2的代码,而非控制任务执行顺序。你看到的错误,是因为Android模块(或你的自定义AwesomePlugin)的可消费配置需要特定属性(比如build type、flavor等),直接用project(":subproj2")找不到匹配的配置才会报错。
正确解决方案:配置任务间的依赖关系
你真正需要的是让subproj1的customTask依赖于subproj2的customTask,这样Gradle会自动保证先执行subproj2的任务,再执行subproj1的。具体操作如下:
先移除subproj1的
build.gradle里的模块依赖(如果不需要代码层面引用的话):// subproj1/build.gradle // 删除这行:api project(":subproj2")在subproj1的
build.gradle里,给customTask添加任务依赖:// subproj1/build.gradle task("customTask") { // 你的任务逻辑代码... } // 关键配置:让subproj1的customTask等待subproj2的customTask完成 customTask.dependsOn(project(":subproj2").tasks.named("customTask"))
如果你确实需要模块依赖(代码层面引用)
如果subproj1的代码确实需要用到subproj2的代码,那你需要指定匹配的Android模块配置,比如指定release版本的runtime配置:
// subproj1/build.gradle dependencies { api project(path: ":subproj2", configuration: "releaseRuntimeElements") }
注意:这和任务执行顺序是两回事,即使加了这个模块依赖,你仍需要单独配置任务依赖来保证执行顺序。
全局统一控制任务顺序的方式
如果你想在根项目统一管理任务顺序,也可以在myproj/build.gradle里配置:
// myproj/build.gradle subprojects { tasks.whenTaskAdded { task -> if (task.name == "customTask" && project.path == ":subproj1") { task.dependsOn(project(":subproj2").tasks.named("customTask")) } } }
这样配置后,当你执行gradle customTask时,Gradle会先完整执行subproj2:customTask,再执行subproj1:customTask,完全符合你的需求。
内容的提问来源于stack exchange,提问作者user1236048

