【问题标题】:Gradle - Delete files with certain extensionGradle - 删除具有特定扩展名的文件
【发布时间】:2015-02-01 20:27:01
【问题描述】:

我正在使用 Gradle,并想删除所有具有特定扩展名的文件。这是 Gradle 可以做到的吗?

【问题讨论】:

  • Gradle 几乎可以做任何可以用 groovy 编写的脚本。所以,真正的问题是,“是否有一个 gradle task 可以删除具有特定扩展名的文件。”如果它不是作为任务编写的,那么您将无法从 gradle 的任务图 (myBuild.dependsOn('deleteFiles')) 和/或增量构建中受益。

标签: gradle


【解决方案1】:

使用 Gradle Delete 任务。

task deleteFiles(type: Delete) {
    delete fileTree('dir/foo') {
        include '**/*.ext'
    }
}

【讨论】:

  • 对我来说做到了:delete fileTree(dir:'dir/foo', include: '**.ext')(Gradle 4.1,2017)
  • 如何声明一个删除类型的外部方法?即 ext.deleteFiles = { type: Delete String... fileNames -> fileNames.each{ fileName -> delete $fileName } }
  • @GuerinoRodella 不需要,已经有一个 project.delete() 方法用于此目的。
  • 抱歉,您的解释看起来有误。这只是配置,直到调用clean 任务才会运行
【解决方案2】:

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

clean{
  delete 'buildDir', 'generated'
}

如果你想使用 glob,你可以使用fileTree,或者任何其他方便的方法来列出文件:

clean{
  delete 'build', 'target', fileTree(dockerBuildDir) { include '**/*.rpm' }
}

【讨论】:

  • 您遇到了什么问题?
  • 嗨@Hubbitus,我在我的回答中解释了~
【解决方案3】:

有几种方法可以删除特定扩展名的文件。一般情况下,您必须选择一些文件;然后过滤其中一些文件,最后删除提醒文件。例如试试这个:

def tree = fileTree('${SOME_DIR}') 
tree.include '**/*.${SOME_EXT}'
tree.each { it.delete() }

【讨论】:

  • 请注意,这本质上是使用 gradle 的 Project.fileTree API 的 groovy 代码。除非包含在自定义任务块中,否则代码将始终在 gradle 构建的配置阶段执行。
【解决方案4】:
clean {
  delete xxxx
}

上面的 clean 不太正确。因为它实际上通过任务名称调用了一个名为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()
        }
    }
}

【讨论】:

  • 太难了...为什么不直接使用doLast?如果您不调用任务clean,则不会调用clean { delete xxxx }
  • 因为默认清理任务已包含默认删除操作。我们需要 deleteAllActions()。 self
  • 请尝试,如果不是干净的任务,它不会运行。只是任务配置
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 2016-01-06
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多