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

标签 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]

最佳答案

遵循@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/

    相关文章:

    docker - Gradle docker由于执行顺序而无法构建镜像

    java - Gradle 项目同步失败 - Android Studio 0.8.14

    android - "Error:(22, 0) CreateProcess error=2, The system cannot find the file specified"如何在build.gradle中使用git命令

    gradle - 如何将文件从buildSrc复制到主版本

    gradle - 如何告诉 Gradle 一直使用 --console=plain?

    android - 拆分后的apk仅上传到Google Play

    android - 当我尝试同步Gradle文件时,出现错误

    gradle - 如何从Gradle中检测当前的操作系统

    java - 在 Android Studio 中的 Java 和 Android 程序之间共享一个 OpenCV 类

    gradle - 无法从 android studio 同步 gradle,但可以从控制台同步