我试图解决一个问题,我的构建中的依赖项是一个包含一些只读文件的zip文件。当我作为构建的一部分提取该zip时,我最终只能在暂存文件夹中使用只读文件,并且由于无法覆盖任务,因此它们将来会阻止该任务运行。
在有一种强制覆盖gradle复制任务的方法之前,我一直试图找到一种方法来改变只读文件的文件模式,不会从那些需要它的文件中删除执行位。
我想出来了:
task stageZip(type: Copy) {
from({ zipTree(zipFile) })
into stagingFolder
eachFile {
println "${it.name}, oldMode: ${Integer.toOctalString(it.mode)}, newMode: ${Integer.toOctalString(it.mode | 0200)}"
fileMode it.mode | 0200
}
}
但这不起作用。如果我注释掉fileMode行,那么println会正确地列出旧文件模式和新文件模式,并为所有文件启用写入位。如果我按原样保留代码,则zip中的所有文件都将使用第一个文件的newMode提取。
这似乎不是尝试做的不合理的事情,但我显然做错了什么。有什么建议?
基于this thread,考虑Sync task。特别:
task stageZip(type: Sync) {
from zipTree('data/data.zip')
into 'staging'
fileMode 0644
}
我提出了一个有效的例子(我理解这个问题)here。
这是一个回答有关文件权限的问题的方法。该示例发布到GitHub here。
首先,考虑一种将w
添加到文件的方法:
import java.nio.file.*
import java.nio.file.attribute.PosixFilePermission
def addWritePerm = { file ->
println "TRACER adding 'w' to : " + file.absolutePath
def path = Paths.get(file.absolutePath)
def perms = Files.getPosixFilePermissions(path)
perms << PosixFilePermission.OWNER_WRITE
Files.setPosixFilePermissions(path, perms)
}
然后,Gradle任务可以如下:
project.ext.stagingFolder = 'staging'
project.ext.zipFile = 'data/data.zip'
task stageZip(type: Copy) {
from({ zipTree(project.ext.zipFile) })
into project.ext.stagingFolder
doLast {
new File(project.ext.stagingFolder).eachFileRecurse { def file ->
if (! file.canWrite()) {
addWritePerm(file)
}
}
}
}