为何Gradle中删除rootProject.buildDir的clean任务会移除模块build目录?
为什么执行
gradlew clean会同时删除根项目和模块的build目录? 这问题我刚接触Gradle的时候也踩过坑,乍一看确实不符合直觉,咱们来唠唠背后的原因:
首先,你在根项目的build.gradle里定义的这个clean任务:
task clean(type: Delete) { delete rootProject.buildDir }
它本身确实只会删除根项目根目录下的build文件夹,不会主动去删模块的build目录。那模块的build为啥没了?
核心原因是:当你在根项目执行gradlew clean命令时,Gradle会自动触发所有项目(包括根项目和所有子模块)中名为clean的任务。
每个Android模块(子项目)在应用Android Gradle插件后,都会自动生成一个属于自己的clean任务,这个任务的作用就是删除当前模块下的build目录。当你在根项目运行clean命令时,Gradle会遍历整个项目结构,执行所有匹配的clean任务——根项目的clean删根目录build,每个模块的clean删自己的build,所以最终你看到所有build目录都没了。
可能你会疑惑:我明明在根项目重新定义了clean任务,为啥子模块的还会执行?这是因为Gradle的任务是按名称匹配的,clean是一个约定俗成的任务名,不管是根项目还是子项目的,只要叫这个名字,执行根命令时都会被触发。而且Android插件会自动为每个子模块配置这个任务,不需要你手动写。
如果只想单独清理根项目的build目录,你可以给根项目的任务改个名字,比如叫cleanRootBuild,然后执行gradlew cleanRootBuild,这样就只会删除根目录的build,不会影响模块的了。
内容的提问来源于stack exchange,提问作者gesanri
相关产品推荐
相关产品推荐

