You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle Copy任务中动态设置文件权限的问题求助

解决Gradle Copy任务中单个文件权限修改的问题

这个问题我之前也碰到过,核心原因是你混淆了Gradle Copy任务中全局文件权限配置和单个文件权限调整的方式:

你原来的代码里调用的fileMode是Copy任务的全局属性,用来设置所有文件的默认权限。当你在eachFile闭包里反复调用它时,其实是在不断覆盖整个任务的默认权限值,最终所有文件都会使用最后一次设置的权限(或者在你的场景里因为执行顺序问题变成了第一个文件的权限),而不是每个文件单独计算的结果。

正确的解决方法

要为每个文件单独修改权限,应该直接修改eachFile闭包中FileCopyDetails对象的mode属性,这才是针对单个文件的权限配置项:

task stageZip(type: Copy) {
    from({ zipTree(zipFile) })
    into stagingFolder
    eachFile {
        def newMode = it.mode | 0200
        println "${it.name}, oldMode: ${Integer.toOctalString(it.mode)}, newMode: ${Integer.toOctalString(newMode)}"
        it.mode = newMode // 直接修改当前文件的权限,而非全局任务配置
    }
}

原理说明

  • it.mode是FileCopyDetails对象的属性,对应当前处理的单个文件的权限位,修改它只会影响当前文件。
  • 这样每个文件都会基于自身原有的权限计算新的权限(通过| 0200添加用户写入位),同时保留原本的执行位、组权限等其他权限设置,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Guy Gascoigne-Piggford

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:23:28