gradle - 如果至少一个不是最新的,Gradle将复制所有文件

标签 gradle

例如,我有以下任务:

task testCopy(type: Copy) {
    from ("folder/copy_from")
    into ("folder/copy_to")

    eachFile {println it.name}
}

除非触摸文件夹copy_from的内部文件,否则任务将正常运行。更改后,假设文件夹copy_from中有一个文件,然后Gradle开始将所有文件从copy_from文件夹复制到copy_to中,而不是仅复制一个更改/添加的文件。

这是预期的行为吗?有没有一种方法可以使Gradle仅复制更改/添加的文件?

最佳答案

是,基于this github issuegradle discuss:

The build is incremental in the sense that the copy task only executes when things have changed but it isn’t incremental itself, in that it only copies inputs that have been modified.



我找不到合适的解决方案,但是一个解决方案只是将您的任务拆分为具有特定类型的较小任务。
task copy1(type: Copy) {
       into 'build/out'
       from ('src') {
            include 'docs/*.txt'
       }
       eachFile {println it.name}
}

task copy2(type: Copy) {
    into 'build/out'
    from ('src') {
        include 'docs/*.md'
    }

    eachFile {println it.name}

}

task copy3 {
    dependsOn copy1, copy2
}

这并不是您想要的,但是它通过减少要复制的文件来提高性能。
当您更改文本文件并运行gradle copy3时,它仅复制文本文件而不是md文件。

更新:
Ant 复制任务没有这个问题
documentation:

By default, files are only copied if the source file is newer than the destination file, or when the destination file does not exist. However, you can explicitly overwrite files with the overwrite attribute



因此,您可以改用ant copy任务,就像我们可以use ant tasks from gradle一样:
task copyFromAnt {
    doLast {
        ant.copy(todir: 'build/out') {
            fileset(dir: 'src')
        }
    }
}

ant记录它复制的文件,因此您可以在gradle -dgrep的帮助下检查日志:
gradle copyFromAnt -d | grep "\[ant:copy\]"

并仅查看它所复制的文件的最新信息等,可以使用以下命令:
gradle copyFromAnt -d | grep "\[ant:copy\] Copying"

关于gradle - 如果至少一个不是最新的,Gradle将复制所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57216661/

相关文章:

java - 运行 gradle 任务时在应用程序中获取 jvm 参数

eclipse - 如何通过gradle在Eclipse项目中添加对类路径的具体引用?

java - 如何运行用 cucumber-jvm 和 gradle 标签过滤的测试?

Gradle - 发布工件

java - Spring Boot应用程序找不到webjar文件

gradle - 管理共享 Protocol Buffer 库并使用Gradle进行编译

gradle - 在根项目 'shadowJar' 中找不到任务 'papercontract'

eclipse - 如何在 Eclipse 中添加/运行 Hiero?

kotlin - Gradle:仅在发布到本地时才更改工件名称

android - Gradle中的本地化资源变量