在 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)
            }
        }
    }
}