删除任务始终是UP-TO-DATE

时间:2017-09-11 10:16:58

标签: gradle build

我在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 }

但它没有任何效果。

2 个答案:

答案 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答案完美解释。