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

时间:2015-10-14 21:11:51

标签: gradle

将自定义作业与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]

1 个答案:

答案 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.添加一些方法调用前缀。)
  • 我仍然需要在doLast块中调用Files.createDirectories()。我预计现在这将是多余的。
  • 运行多个任务时.mustRunAfter排序的各种应用程序没有帮助。
  • 调试日志(如问题中所述)没有提供任何线索,表明任务在某种程度上重叠。