将自定义作业与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]
答案 0 :(得分:0)
按照@ 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
排序的各种应用程序没有帮助。