Gradle 4.4:如何让clean任务在依赖加载前执行
Gradle 4.4 解决 clean 与依赖加载顺序/缓存分离问题
方案一:分离build1缓存目录,仅清理专属缓存
这个方案更稳妥,避免影响默认依赖的缓存,核心是让build1的额外库下载到单独的子目录,clean任务根据是否执行build1来调整清理范围。
修改后的build.gradle配置:
ext { project.dependencies.add(compile, somelibraries) } clean { doFirst { // 判断是否同时执行clean和build1任务 def isBuild1Clean = gradle.startParameter.taskNames.containsAll(['clean', 'build1']) if (isBuild1Clean) { // 仅清理build1专属缓存目录 delete "${WORKSPACE}/caches/build1" println "已清理build1专属缓存" } else { // 保持原逻辑,清理整个缓存目录 delete "${WORKSPACE}/caches" println "已清理全部缓存" } } } dependencies { ecj 'org.eclipse.jdt.core.compiler:ecj:4.6.1' compile fileTree(dir: "${WORKSPACE}/lib", include: '*.jar') } task build1 { // 修改build1的库加载路径,将额外库下载到专属子目录 def build1CacheDir = "${WORKSPACE}/caches/build1" (loads extra libraries into build1CacheDir) (some compiling) }
效果
- 执行
gradle clean build1时,仅删除build1的专属缓存,默认依赖的缓存不受影响,build1执行时会重新下载自己的额外库,不会报错。 - 单独执行
gradle clean时,仍清理整个缓存目录,保留原有逻辑。
方案二:让清理动作提前到配置阶段之前执行
如果无法分离缓存目录,可将清理逻辑移到Gradle的初始化阶段(早于依赖解析的配置阶段),确保删除缓存后,默认依赖能重新下载。
修改后的build.gradle配置:
// 初始化阶段执行,早于配置阶段 def taskNames = gradle.startParameter.taskNames if (taskNames.contains('clean') && taskNames.contains('build1')) { def cacheDir = new File("${WORKSPACE}/caches") if (cacheDir.exists()) { cacheDir.deleteDir() println "已在配置前清理缓存目录" } } ext { project.dependencies.add(compile, somelibraries) } clean { doFirst { // 仅在未同时执行build1时,执行原清理逻辑 def isBuild1Clean = gradle.startParameter.taskNames.containsAll(['clean', 'build1']) if (!isBuild1Clean) { delete "${WORKSPACE}/caches" } } } dependencies { ecj 'org.eclipse.jdt.core.compiler:ecj:4.6.1' compile fileTree(dir: "${WORKSPACE}/lib", include: '*.jar') } task build1 { (loads extra libraries which I intend to delete using clean) (some compiling) }
效果
- 执行
gradle clean build1时,初始化阶段先删除整个缓存目录,随后配置阶段Gradle会自动重新下载默认依赖到缓存,执行阶段clean任务跳过清理,build1执行时下载自己的额外库,不会报错。 - 单独执行
gradle clean时,仍按原逻辑清理整个缓存目录。
内容的提问来源于stack exchange,提问作者Lunartist
相关产品推荐
相关产品推荐

