gpt4 book ai didi

gradle - 'gradle clean'似乎杀死了我的目标目录

转载 作者:行者123 更新时间:2023-12-03 04:36:49 25 4
gpt4 key购买 nike

将自定义作业与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.。)
  • 我仍然需要doLast块中的Files.createDirectories()调用。我希望这将是多余的。
  • 运行多个任务时,.mustRunAfter排序的各种应用程序无济于事。
  • 调试日志(如问题中所述)没有任何线索表明任务以某种方式重叠。
  • 关于gradle - 'gradle clean'似乎杀死了我的目标目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33135647/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com