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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在gradle Copy任务中动态设置文件权限相关的知识,希望对你有一定的参考价值。

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

以上是关于在gradle Copy任务中动态设置文件权限的主要内容,如果未能解决你的问题,请参考以下文章

Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.1——编写自己的任务

Gradle 任务 -- 任务的弃用和禁用

如何使用 gradle 中的复制任务复制目录

是否有使用 gradle 设置文件权限的独立于平台的方法?

在 Gradle 任务中对属性文件的内容进行排序

android studio 异常:Gradle 任务 assembleDebug 失败,退出代码为 1