将自定义作业与Gradle的clean
作业结合使用时,我在效果方面苦苦挣扎。在开始任何细节之前,这里先简单地观察一下:
$ gradle clean; gradle myJob # works!
$ gradle clean myJob # fails!
使用
--stacktrace
运行第二次调用会显示NoSuchFile
异常。这是
myJob
的要点(这是原始作业的稍微简化的版本,取自内存,因此请原谅小故障):task myJob {
doLast {
Files.createDirectories(Paths.get("$buildDir/tmp1"))
configurations.someConfiguration.collect {
zipTree(it).matching {
include somePattern
}
}.files.each { coll ->
coll.each {
Files.copy(
Paths.get(it.path),
Paths.get("$buildDir/tmp1", "foo"),
StandardCopyOption.REPLACE_EXISTING)
}
}
}
}
我得到
myJob
使用build
下的目标目录,该目录是clean
递归删除的目录。在两个任务组合调用之后,发生异常时,证明build/tmp1
不存在。我没有得到的是我在执行时间块中谨慎使用的
Files.createDirectories()
调用,在这种情况下似乎没有创建目标目录。否则,目录将立即删除。但是,将组合调用与
--debug
一起运行将显示clean
作业已执行并在myJob
启动之前终止(至少根据顺序和相应消息流经的时间戳)。那么为什么复制开始时缺少
build/tmp1
?我该怎么做才能防止这种情况发生?
[这是Gradle 2.3]
最佳答案
遵循@ReneGroeschke关于输出目录的提示,此版本在我的环境中有效:
task myJob {
outputs.files files("$buildDir/tmp1") // <-- THE FIX
doLast {
Files.createDirectories(Paths.get("$buildDir/tmp1"))
configurations.someConfiguration.collect {
zipTree(it).matching {
include somePattern
}
}.files.each { coll ->
coll.each {
Files.copy(
Paths.get(it.path),
Paths.get("$buildDir/tmp1", "foo"),
StandardCopyOption.REPLACE_EXISTING)
}
}
}
}
在任务的配置部分中注意其他
outputs.files
条目。有几件事仍然困扰着我:
build.gradle
文件中使用还是从“已应用”的二进制插件中使用,该代码的行为都不同。 (对于二进制版本,您需要进行一些调整,例如在方法调用之前添加project.
。)Files.createDirectories()
调用。我希望这将是多余的。 .mustRunAfter
排序的各种应用程序无济于事。 关于gradle - 'gradle clean'似乎杀死了我的目标目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33135647/