Gradle删除定义为任务输出的目录(过时目录)

时间:2017-10-18 09:54:45

标签: java gradle

我的unzipData gradle任务定义如下:

task unzipFile(type: Copy) {
  dependsOn mkdirTrash
  dependsOn downloadFile

  from zipTree(file("$trashDir/file.zip"))
  into trashDir
}

该任务将存档内容直接解压缩到具有存档本身的目录中(位于trash目录,该目录是所有任务工件的根目录,只有在完成所有准备任务后才能删除。

在我将gradle包装器更新到版本4.2.1之前,以前的工作一直有效。

任务执行开始产生错误:

FAILURE: Build failed with an exception.

* What went wrong:
Cannot expand ZIP 'trash/file.zip' as it does not exist.

在调试输出中,我看到gradle删除了整个trash目录

> Task :unzipFile
11:56:23.145 [DEBUG] [org.gradle.internal.progress.DefaultBuildOperationExecutor] Build operation 'Task :unzipFile' started
11:56:23.145 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Starting to execute task ':unzipFile'
11:56:23.145 [INFO] [org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter] Putting task artifact state for task ':unzipFile' into context took 0.0 secs.
11:56:23.204 [DEBUG] [org.gradle.internal.progress.DefaultBuildOperationExecutor] Build operation 'Clean stale outputs' started
11:56:23.204 [INFO] [org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter] Deleting stale output file: /.../trash

据我所知,这是gradle的新功能 https://docs.gradle.org/4.2-rc-1/release-notes.html#safer-handling-of-stale-output-files

文档说只有目录注册为清洁任务的目标源集输出是陈旧的。我想,Copy任务是source set之一,它的输出必然会被删除。

我想知道这个功能的优点是什么? 是否有可能禁止清理特定目录? 任何不肮脏的解决方法?

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,跟着this approach,它对我有用,在你的情况下它会是这样的:

sourceSets {
    main {
        output.dir("$trashDir", builtBy: 'unzipFile')
    }
}

task unzipFile(type: Copy) {
    dependsOn mkdirTrash
    dependsOn downloadFile
    from zipTree(file("$trashDir/file.zip"))
    into trashDir
    outputs.dir sourceSets.main.output.resourcesDir
}