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

Posted

技术标签:

【中文标题】如何扩展 gradle 的 clean 任务以删除文件?【英文标题】:How do I extend gradle's clean task to delete a file? 【发布时间】:2015-07-01 00:47:52 【问题描述】:

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

apply plugin: 'base' 
clean << 
    delete '$rootDir/api-library/auto-generated-classes/'
    println '$rootDir/api-library/auto-generated-classes/'

但是,不仅我的文件没有被删除,而且打印语句显示$rootDir 没有被转换到我的项目的根目录。为什么这不起作用,我缺少什么概念?

【问题讨论】:

【参考方案1】:

在 gradle 中有一些选项,您可以使用 doFirst(在实际任务之前)、doLast(在实际任务之后)扩展特定任务(在您的情况下为“干净”)。

你只需要用双引号替换单引号。

clean.doFirst 
    delete "$rootDir/api-library/auto-generated-classes"
    println "$rootDir/api-library/auto-generated-classes"

【讨论】:

【参考方案2】:

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

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


tasks.clean.dependsOn(tasks.customCleanUp)

【讨论】:

【参考方案3】:

Gradle Kotlin 脚本模拟:

tasks 
    getByName<Delete>("clean") 
        delete.add("logs") // add accepts argument with Any type
    

【讨论】:

也可以通过索引获取clean任务:tasks["clean"]...【参考方案4】:

你只需要使用双引号。此外,如果您打算在执行期间进行删除,请删除 &lt;&lt; 并改用 doFirst。像这样的:

clean.doFirst 
    delete "$rootDir/api-library/auto-generated-classes/"
    println "$rootDir/api-library/auto-generated-classes/"

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

【讨论】:

不确定。它将在 configuration 阶段删除文件,而不是在执行期间。 以上评论不属实。 doFirst 仅在execution 阶段进行评估。 调用doFirst 和doLast 可以多次执行。他们将动作添加到任务动作列表的开头或结尾。当任务执行时,动作列表中的动作按顺序执行。 from docs【参考方案5】:

&lt;&lt; 等同于clean.doLastdoFirstdoLast 正在对执行阶段的操作进行排序, 这很少与删除操作相关。

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

clean 
    delete 'someFile'

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

clean 
    delete "$buildDir/someFile"

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

apply plugin: 'base'

【讨论】:

delete '$buildDir/someFile' 不会解析buildDir 的变量。您需要在这里使用",例如delete "$buildDir/someFile" ' 的错字更正为"。 GStrings 需要双 wuotes 但是这样你就完全替代了 clean 的默认行为。如果他还有更多任务怎么办? 正如文档中所指出的,Delete 任务的delete 方法: > 添加一些要被此任务删除的文件。因此,这不会取代以前的行为(即以前要删除的文件列表),它只是添加到它。 这导致我出错:Could not find method clean() for arguments [build_6vh7849xb7rs3m0ite221ir66$_run_closure6@20f01807]【参考方案6】:

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

clean.doFirst 

clean.doLast 

这些将允许您将自己的操作注入到干净的过程中。为了删除文件和目录,您可以使用不需要任何额外插件的“文件”API。

这是一个示例,它将在清理任务的最后一步同时删除文件和目录:

clean.doLast 
    file('src/main/someFile.txt').delete()
    file('src/main/libs').deleteDir()

【讨论】:

以上是关于如何扩展 gradle 的 clean 任务以删除文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何添加清理任务 - 找不到任务“清理”

Android Gradle 插件工程根目录下 build.gradle 配置文件 ( 远程仓库配置 | 依赖配置 | 所有子模块配置 | task clean 任务 )

如何在 build.gradle 中将参数传递给 Gradle 任务

由于 .fuse_hidden,Gradle 无法删除目录

如何将 gradle 中的 groovy 任务转换为 Gradle Kotlin DSL 以生成 pom.xml?

制作自定义Gradle任务,生成代码,在IDE导入上运行