在Gradle拷贝任务中动态设置文件权限

rryofs0p  于 2023-02-19  发布在  其他
关注(0)|答案(3)|浏览(163)

我试图解决一个问题,我的构建中的依赖项是一个包含一些只读文件的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会正确地列出旧的和新的文件模式,并为所有文件启用write位;如果我保持代码不变,那么zip中的所有文件都会使用第一个文件的newMode来提取。
这看起来并不是一件不合理的事情,但我显然做错了什么。有什么建议吗?

db2dz4w8

db2dz4w81#

this thread的基础上,考虑Sync task。具体而言:

task stageZip(type: Sync) {
    from zipTree('data/data.zip')
    into 'staging'
    fileMode 0644
}

我已经给出了一个工作示例(就我对问题的理解而言)here

ipakzgxi

ipakzgxi2#

这里有一个方法可以回答关于文件权限的问题,这个例子发布在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)
            }
        }
    }
}
58wvjzkj

58wvjzkj3#

eachFile {
        file -> file.setMode(file.getMode() | 0200)
    }

在一个rpm任务中为我工作,该任务与copyspec一起工作

相关问题