如何扩展 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】:
你只需要使用双引号。此外,如果您打算在执行期间进行删除,请删除 <<
并改用 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】:
<<
等同于clean.doLast
。
doFirst
和 doLast
正在对执行阶段的操作进行排序,
这很少与删除操作相关。
在这种情况下,您不需要其中任何一个。 来自 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 任务