在gradle Copy任务中动态设置文件权限

问题描述 投票:0回答:2

我试图解决一个问题,我的构建中的依赖项是一个包含一些只读文件的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提取。

这似乎不是尝试做的不合理的事情,但我显然做错了什么。有什么建议?

gradle file-permissions
2个回答
1
投票

基于this thread,考虑Sync task。特别:

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

我提出了一个有效的例子(我理解这个问题)here


1
投票

这是一个回答有关文件权限的问题的方法。该示例发布到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)
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.