如何扩展gradle的清理任务以删除文件?

oib*_*ibe 47 gradle build.gradle

到目前为止,我已将以下内容添加到build.gradle中

apply plugin: 'base' 
clean << {
    delete '${rootDir}/api-library/auto-generated-classes/'
    println '${rootDir}/api-library/auto-generated-classes/'
}
Run Code Online (Sandbox Code Playgroud)

但是,不仅我的文件没有被删除,而且print语句显示${rootDir}没有被转换为我的项目的根目录.为什么这不起作用,我错过了哪些概念?

mus*_*001 60

你只需要使用双引号.另外,如果您计划在执行期间执行删除操作,请删除<<并使用doFirst.像这样的东西:

clean.doFirst {
    delete "${rootDir}/api-library/auto-generated-classes/"
    println "${rootDir}/api-library/auto-generated-classes/"
}
Run Code Online (Sandbox Code Playgroud)

Gradle构建脚本是用Groovy DSL编写的.在Groovy中,您需要使用双引号进行字符串插值(当您${}用作占位符时).看看这里.

  • 以上评论不正确.doFirst仅在`execution`阶段进行评估._调用doFirst和doLast可以多次执行.他们将操作添加到任务的操作列表的开头或结尾.当任务**执行**时,操作列表中的操作将按顺序执行.[来自docs](https://docs.gradle.org/current/userguide/tutorial_using_tasks.html) (5认同)

Alp*_*par 43

<< 相当于clean.doLast. doFirst并且doLast执行阶段对操作进行排序,这与删除操作很少相关.

在这种情况下,您不需要其中任何一个.base的clean任务是Delete类型,所以你只需要传递一个闭包来告诉它在配置时执行时要删除的内容:

clean {
    delete 'someFile'
}
Run Code Online (Sandbox Code Playgroud)

AS mushfek0001在他的答案中正确指出,你应该使用双引号进行变量插值工作:

clean {
    delete "${buildDir}/someFile"
}
Run Code Online (Sandbox Code Playgroud)

你需要至少应用这个基本插件才能工作,大多数其他插件,比如Java插件要么应用base,要么声明自己的 clean任务类型delete delete task.如果没有这个,你会得到的错误是缺少clean方法之一.

apply plugin: 'base'
Run Code Online (Sandbox Code Playgroud)

  • 正如文档中所指出的,`Delete`任务的`delete`方法:>添加一些要由此任务删除的文件.因此,这不会取代以前的行为(即先前要删除的文件列表),它只是添加了它. (5认同)
  • `delete'$ {buildDir}/someFile'`将无法解析`buildDir`的变量.你需要在这里使用```,例如`delete"$ buildDir/someFile"` (2认同)

bst*_*r55 15

为了扩展清理任务,您可以使用

clean.doFirst {}
Run Code Online (Sandbox Code Playgroud)

要么

clean.doLast {}
Run Code Online (Sandbox Code Playgroud)

这些将允许您将自己的操作注入清理过程.要删除文件和目录,您可以使用"文件"API,不需要任何其他插件.

这是一个删除文件和目录的示例,作为clean任务的最后一步:

clean.doLast {
    file('src/main/someFile.txt').delete()
    file('src/main/libs').deleteDir()
}
Run Code Online (Sandbox Code Playgroud)


Sur*_* TR 9

下面一个对我有用(我更喜欢使用dependsOn),

task customCleanUp(type:Delete) {
   delete "your_folder", "your_file"
}

tasks.clean.dependsOn(tasks.customCleanUp)
Run Code Online (Sandbox Code Playgroud)


Man*_*gor 6

Gradle Kotlin 脚本模拟:

tasks {
    getByName<Delete>("clean") {
        delete.add("logs") // add accepts argument with Any type
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您还可以通过索引获取`clean`任务:`tasks["clean"]...` (2认同)