Gradle删除定义为任务输出的目录(陈旧目录)

Ser*_*ich 5 java gradle

我有一个unzipDatagradle任务定义如下:

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

  from zipTree(file("$trashDir/file.zip"))
  into trashDir
}
Run Code Online (Sandbox Code Playgroud)

该任务将存档内容直接与存档本身一起解压缩到目录中(在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.
Run Code Online (Sandbox Code Playgroud)

在调试输出中,我看到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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ale*_*ira 3

我遇到了同样的问题,遵循了这种方法,它对我有用,在你的情况下,它会是这样的:

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
}
Run Code Online (Sandbox Code Playgroud)