Gradle-删除具有特定扩展名的文件

Gradle-删除具有特定扩展名的文件,gradle,Gradle,我正在使用Gradle,希望删除具有特定扩展名的所有文件。Gradle可以这样做吗?有几种方法可以删除具有特定扩展名的文件;然后过滤其中一些,最后删除提醒文件。例如,请尝试以下操作: def tree = fileTree('${SOME_DIR}') tree.include '**/*.${SOME_EXT}' tree.each { it.delete() } 使用Gradle任务 您可以自定义默认的clean任务,以包括其他要删除的目录和文件,如: clean{ delete '

我正在使用Gradle,希望删除具有特定扩展名的所有文件。Gradle可以这样做吗?

有几种方法可以删除具有特定扩展名的文件;然后过滤其中一些,最后删除提醒文件。例如,请尝试以下操作:

def tree = fileTree('${SOME_DIR}') 
tree.include '**/*.${SOME_EXT}'
tree.each { it.delete() }
使用Gradle任务


您可以自定义默认的
clean
任务,以包括其他要删除的目录和文件,如:

clean{
  delete 'buildDir', 'generated'
}
如果要使用glob,可以使用
fileTree
或任何其他方便的方法列出文件:

clean{
  delete 'build', 'target', fileTree(dockerBuildDir) { include '**/*.rpm' }
}
上面的说法不太正确。因为它实际上按任务名调用名为
clean
的方法。这种方法通常用于配置任务,它发生在配置时间,而不是任务执行时间

如果需要修改默认的clean,以下是一种更合理的方法。我的例子是删除除一个文件之外的所有文件。清理任务中的删除操作现在确实在任务执行时发生

    clean {

    Task self = delegate
    self.deleteAllActions()
    self << {

        project.delete(fileTree(dir: buildDir).exclude("**/tmp/expandedArchives/org.jacoco.agent*/**"))

        def emptyDirs = []

        project.fileTree(dir: buildDir).visit {
            File f = it.file

            if (f.isDirectory() ) {
                def children = project.fileTree(f).filter { it.isFile() }.files
                if (children.size() == 0) {
                    emptyDirs << f
                }
            }
        }

        // reverse so that we do the deepest folders first
        emptyDirs.reverseEach {
            println "delete file: " + it + ", " + project.delete(it) //it.delete()
        }
    }
}
clean{
任务自=委托
self.deleteAllActions()

self-Gradle几乎可以做任何可以在groovy中编写脚本的事情。因此,真正的问题是,“是否有一个Gradle任务可以删除具有特定扩展名的文件。”如果它不是作为任务编写的,那么您就无法从Gradle的任务图(
myBuild.dependsOn('deleteFiles')
)中获益和/或增量生成。请注意,这本质上是使用gradle的Project.fileTree API的groovy代码。除非包含在自定义任务块中,否则这些代码将始终在gradle生成的配置阶段执行。对我来说,这样做是:
删除文件树(dir:'dir/foo',include:'**.ext')
(gradle 4.120017)如何声明delete类型的外部方法?即ext.deleteFiles={type:delete String…fileName->fileName.each{fileName->delete$fileName}@GuerinoRodella不需要,已经有了一个用于此目的的方法。抱歉,但是您的解释看起来是错误的。这只是配置,在
clean
任务调用之前不会运行。您看到了什么问题?嗨@Hubbitus,我在我的回答中解释了~太难了…为什么不直接使用
doLast
?以及
clean有什么不正确的地方{delete xxxx}
如果不调用task
clean
则不会调用它,因为默认的clean任务包含默认的删除操作。我们需要deleteAllActions()。self请尝试,如果它不是clean任务,则不会运行。这只是任务配置
clean {
  delete xxxx
}
    clean {

    Task self = delegate
    self.deleteAllActions()
    self << {

        project.delete(fileTree(dir: buildDir).exclude("**/tmp/expandedArchives/org.jacoco.agent*/**"))

        def emptyDirs = []

        project.fileTree(dir: buildDir).visit {
            File f = it.file

            if (f.isDirectory() ) {
                def children = project.fileTree(f).filter { it.isFile() }.files
                if (children.size() == 0) {
                    emptyDirs << f
                }
            }
        }

        // reverse so that we do the deepest folders first
        emptyDirs.reverseEach {
            println "delete file: " + it + ", " + project.delete(it) //it.delete()
        }
    }
}