我在Gradle中执行了一项简单的任务:
task cleanBuild(type: Delete) {
def build = ".src/buildfiles"
FileTree tree = fileTree (dir: dbEditorBuild);
tree.each { File file ->
println file
}
}
当我运行它时,我得到了这个输出:
:user:cleanBuild UP-TO-DATE
BUILD SUCCESSFUL
Total time: 1.656 secs
我已经阅读了文档,并且说任务结果是为了提高性能而缓存的。我想重新执行任务,但我不能。这就是编辑任务代码。所以,显然,似乎Gradle无法检测到任务已被更改,哪种类型很糟糕。
我已尝试过其他人推荐的内容,例如将此行添加到任务中:
outputs.upToDateWhen { false }
但它没有任何效果。
答案 0 :(得分:2)
您定义了Delete
类型的任务,但您没有定义要删除的任何文件。这就是为什么你的任务总是最新的原因,因为它无关紧要。您可以通过delete
方法定义要删除的文件。您传递给此方法的所有内容都将通过Project.files(...)
进行评估:
task myDelete(type: Delete) {
delete 'path/to/file', 'path/to/other/file'
}
请注意,您的代码示例不会干扰最新的检查,它甚至根本不会干扰任务。由于您没有使用doFirst
/ doLast
闭包,因此您正在使用任务的配置闭包,该任务在配置阶段期间执行。由于您还没有使用任何任务方法,因此如果将代码置于任务配置闭包之外,则代码将完全相同。
作为一个小小的补充:即使这个特定问题不是由Gradle最新检查引起的,也有办法强制Gradle执行忽略任何任务优化的所有任务:只需添加--rerun-tasks
as命令行参数,如the docs中所述。
答案 1 :(得分:1)
如果您尝试删除一些未使用默认clean
任务删除的其他文件(因为它只删除build
目录),您可以扩展清理任务以删除其他内容
clean {
delete += "$buildDir"
delete += "$rootDir/someDir/someClass.java"
delete += "$rootDir/otherDir
}
或者为delete文件创建一个新任务,并依赖它来进入构建生命周期。
task deleteSomething(type: Delete) {
// to delete a file
delete 'uglyFolder', 'uglyFile'
// to delete a directory
delete 'uglyFolder'
followSymlinks = true
}
删除文件时不会遵循默认符号链接。要更改此行为,请使用true调用Delete.setFollowSymlinks(boolean)。在不支持符号链接的系统上,这将不起作用。
或者您可以将操作置于执行阶段,然后将其删除。
task cleanBuild {
def build = new File("$rootDir/src/buildfiles")
doLast{
build.deleteDir()
}
}
另外,请确保该任务有事可做,因为如果任务无关,则无需删除等,它将打印UP-TO-DATE @ lu.koerfer答案完美解释。