为什么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:你说得对,这种行为可以解释为处理更复杂的复制规范的最简单方法。