为什么Gradle Copy任务会快照目标目录中的所有内容?

为什么Gradle Copy任务会快照目标目录中的所有内容?,gradle,file-permissions,Gradle,File Permissions,我在任务中遇到了一个问题,下面的示例演示了这一点: task deploy(type: Copy) { from "foo.txt" into "/deployment" } 其中/deployment的内容如下: -rw-r--r-- 1 oliverc oliverc 343 Feb 20 14:18 foo.txt drwxr-x--- 22 oliverc oliverc 4096 Feb 22 00:00 basic drwxr-x--- 9 roo

我在任务中遇到了一个问题,下面的示例演示了这一点:

task deploy(type: Copy) {
    from "foo.txt"
    into "/deployment"
}
其中
/deployment
的内容如下:

-rw-r--r--  1 oliverc  oliverc    343 Feb 20 14:18 foo.txt
drwxr-x--- 22 oliverc  oliverc   4096 Feb 22 00:00 basic
drwxr-x---  9 root     root      4096 Jan 24 17:55 important
当我运行
/gradlew deploy--stacktrace
(作为
oliverc
用户)时,Gradle*抱怨:

org.gradle.api.GradleException: Could not list contents of directory '/deployment/important' as it is not readable.
    at org.gradle.api.internal.file.collections.DirectoryFileTree.walkDir(DirectoryFileTree.java:141)
    at ... 
    at org.gradle.api.internal.changedetection.state.DefaultFileSnapshotter.snapshot(DefaultFileSnapshotter.java:44)
    at ...
显然,投诉是正确的(
/deployment/important
root
所有,没有全球可读权限)。但很明显,Gradle的快照机制正试图将
中的一切捕获到
目标中。因此:

  • 为什么
    复制
    任务要关心此目录中不相关的内容
  • 是否有一个渐变级别的解决方法?**(假设我被这些权限和目录布局所困扰。)

  • *这是使用Gradle 1.10测试的。我还没有调查这是否是其他版本的问题

    **我意识到我可以使用
    Project.copy
    而不是
    copy
    任务,但这样我就失去了增量部署。

    它对所有内容进行快照,以查看任务是否是最新的。如果自上次运行任务以来,源和目标没有改变,那么Gradle会通过不做任何事情来优化它,并且任务被标记为最新

    我的猜测是,他们并不试图聪明地确定目标目录的哪些文件必须快照,因为复制任务也接受
    include
    rename
    闭包,因此该任务不能假设没有任何内容不会复制到
    important
    文件夹

    一般来说,Gradle工作得更好(并且假设)每个目标目录都可以被清理,并且一个目标目录不被两个单独的任务共享


    我没有测试过这种变通方法,但我会尝试使用Project.copy()定义自己的任务,并明确准确地指定其输入和输出,以避免丢失增量部署。

    这是
    copy
    任务的已知限制,其输出当前定义为输出目录。我认为没有一个解决方案涉及到
    复制任务;您可以使用
    Project.copy
    ,也可以实现自己的复制任务类型,例如,将其输出定义为一组文件而不是目录


    PS:
    复制
    并不是真正的增量;它要么复制所有内容,要么什么都不复制。

    谢谢!这里似乎有一个定制任务。关于:“已知限制”-是否打算在将来加强这种行为?回复:“增量”-我只是重复文档中的措辞:;)我认为目的是在某一点上改善行为。既然你提到了“增量部署”的需要,我想我应该明确指出复制是全部还是全部。+1:你说得对,这种行为可以解释为处理更复杂的复制规范的最简单方法。