Gradle Task修改需求:删除目录内容但排除Jar文件等问题
Gradle Task 编写解决方案:排除特定文件、删除空目录与递归删除
Hey there! Let's break down your Gradle Task questions with practical, actionable solutions:
1. 修改现有任务,删除目录内容但排除.jar等特定文件
Looking at the code snippet from Heri, we can adjust it to skip .jar files (or any other extensions you want) in two clean ways:
方式一:遍历文件时添加过滤条件
直接在遍历目录内容时,判断文件后缀并跳过:
task deleteGraphicsAssets(type: Delete) { def dirName = "src" file(dirName).listFiles().each { file -> // 排除.jar文件,可添加多个条件比如 || file.name.endsWith(".zip") if (!file.name.endsWith(".jar")) { delete file } } }
方式二:用Gradle的fileTree(更简洁的官方风格)
fileTree支持直接通过exclude规则过滤文件,可读性更强:
task deleteGraphicsAssets(type: Delete) { def dirName = "src" // 删除目录下所有内容,排除.jar文件 delete fileTree(dirName) { exclude "*.jar" // 如果要排除特定子目录,也可以加:exclude "subdir/**" } }
附Heri提供的原始代码片段:
task deleteGraphicsAssets(type: Delete) { def dirName = "src" file( dirName ).list().each{ f -> delete "${dirName..."
2. 删除空目录(递归检查并删除)
Gradle没有内置的空目录删除任务,但我们可以自定义一个任务,用Groovy的文件遍历能力从最底层开始清理空目录:
task deleteEmptyDirectories { doLast { def targetDir = file("src") // 替换为你的目标目录 // POST_ORDER确保先处理子目录,再处理父目录(父目录变空后也能被删除) targetDir.traverse( type: FileType.DIRECTORIES, maxDepth: -1, // 递归所有层级 visit: FileVisit.POST_ORDER ) { dir -> if (dir.listFiles().isEmpty()) { println "Deleting empty directory: ${dir.absolutePath}" dir.delete() } } } }
3. 递归删除目录所有内容(或目录本身)
情况一:删除目录及其所有内容(彻底删掉目录)
Gradle的Delete任务默认支持递归删除,直接指定目录即可:
task deleteDirectoryCompletely(type: Delete) { delete "src" // 替换为你的目标目录 }
情况二:只删除目录内容,保留目录本身
用fileTree指定目录下的所有内容,不删除目录本身:
task deleteDirectoryContent(type: Delete) { delete fileTree("src") // 只删src下的所有文件/子目录,保留src目录 }
内容的提问来源于stack exchange,提问作者Cymbaline Austin
相关产品推荐
相关产品推荐

