在 gradle 复制任务中动态设置文件权限
Setting file permissions dynamically in a gradle Copy task
我正在尝试解决一个问题,即我的构建中的依赖项是一个包含一些只读文件的 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, consider the 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)
}
}
}
}
我正在尝试解决一个问题,即我的构建中的依赖项是一个包含一些只读文件的 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, consider the 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)
}
}
}
}