Gradle 为什么复制任务会在第一次生成时删除过时的输出?

Gradle 为什么复制任务会在第一次生成时删除过时的输出?,gradle,gradle-kotlin-dsl,Gradle,Gradle Kotlin Dsl,我有一个kotlin gradle构建脚本,它代表了我的用例。 我正在与Gradle 6.7合作 这是我的kotlin gradle构建文件: 插件{ JAVA } 任务。注册(“创建文件”){ 多拉斯特{ projectDir.resolve(“tmp.txt”).createNewFile() projectDir.resolve(“tmp.txt”).writeText(“tmp”) } dependsOn(“组装”) } tasks.register(“createExecFile”,E

我有一个kotlin gradle构建脚本,它代表了我的用例。 我正在与Gradle 6.7合作

这是我的kotlin gradle构建文件:

插件{
JAVA
}
任务。注册(“创建文件”){
多拉斯特{
projectDir.resolve(“tmp.txt”).createNewFile()
projectDir.resolve(“tmp.txt”).writeText(“tmp”)
}
dependsOn(“组装”)
}
tasks.register(“createExecFile”,Exec::class){
工作目录(buildDir)
命令行(“cmd”、“/c”、“mkdir destdir\\subdir”)
dependsOn(“创建文件”)
}
tasks.register(“copyBug”,Copy::class){
from(projectDir.resolve(“tmp.txt”))
进入(buildDir.resolve(“destDir”))
dependsOn(“createExecFile”)
}
现在运行
gradlecopybug-i

这将首次为您提供以下输出:

>任务:copyBug删除过时的输出文件:E:\repo\BugCOpy\build\destDir已禁用任务的缓存:copyBug“因为:已禁用生成缓存任务”:copyBug“不是最新的,因为:没有可用的历史记录。
复制任务删除由上一个exec任务创建的文件

现在,如果重新运行此命令,复制任务将不会删除过时的文件

那么这些陈旧的文件是什么呢?如何防止删除这些文件?我的第一个版本与另一个版本不同


我应该提交一个bug吗?

在您的
createExecFile
任务中,您在不告诉Gradle的情况下生成输出文件。因此Gradle不知道此任务和
copyBug
任务使用相同的输出目录。相反,Gradle认为,
copyBug
是在
build/destdir
下生成输出的唯一任务,因此更安全的做法是假设该目录中的任何现有文件都不应该存在(并且是“过时的”)

解决方案是告诉Gradle您的
createExecFile
任务输出到
build/destdir

tasks.register(“createExecFile”,Exec::class){
工作目录(buildDir)
命令行(“cmd”、“/c”、“mkdir destdir\\subdir”)
//告诉Gradle有关输出目录的信息
outputs.dir(buildDir.resolve(“destdir”))
dependsOn(“创建文件”)
}
有关引入此行为的原因以及是否需要更多背景信息,请参阅