每当我尝试使用复制任务将文件复制到项目的根目录(我正在运行gradle的同一文件夹)时,我收到以下错误:
无法为文件内容创建MD5哈希。
我认为这与我从Artifactory中提取的文物有关,但这似乎是无关的。我用最小的脚本得到了相同的结果。
我正在做的事情有什么明显的错误,或Gradle故意不允许这样的事情?
task fails(type:Copy) { from 'build/someFile.txt' into new File('.').absolutePath } task works(type:Copy) { from 'build/someFile.txt' into new File('.').absolutePath + '/output' }
简答回答:不要复制到项目目录中,你最好使用into "$buildDir/someFolder"
,使文件夹被隔离到这个单一任务,并且还将被gradle clean
清理
长答案:在它的核心,Gradle对每一项任务都有一个“UP-TO-DATE”检查的概念。如果Gradle发现自上次执行任务以来没有任何变化,它将使用旧结果而不是再次执行。
通过对任务输入和任务输出进行“散列”来实现UP-TO-DATE检查。由于您使用的是into '.'
,这意味着项目目录的全部内容被视为任务输出(错误)
Gradle使用.gradle
文件夹作为临时文件(例如任务哈希)这可能是其中一些文件因写入而被锁定,因为Gradle正在尝试同时读取相同的文件(以计算任务输出的“哈希”),从而导致错误眼看
*编辑*
如果由于遗留原因需要复制到项目目录中,可以直接使用Project.copy(...)而不是Copy
任务。在这种情况下,您可以手动管理任务输入/输出
例如
task customCopy {
inputs.file "$buildDir/someFile.txt"
outputs.file 'someFile.txt'
doLast {
copy {
from "$buildDir/someFile.txt"
into '.'
}
}
}