【问题标题】:Gradle Copy Task causes file permission issueGradle Copy Task 导致文件权限问题
【发布时间】:2018-01-19 05:10:01
【问题描述】:

背景

我有一个正在开发的 JetBrains 插件。最近,我从Windows 转移到Ubuntu 系统。我正在尝试像以前一样正确设置所有内容。 注意:我对 Linux 还很陌生。

问题

当我运行以下 Gradle 脚本时,我遇到了一个明显的文件权限问题(如本问题的 error 部分所示)。 注意:每当我构建项目时,都会自动调用这个 Gradle 脚本。它在 Windows 上也能正常工作。

如果我注释掉 copy{...} 闭包,那么一切正常。 我只需要手动复制所需的文件。

tasks.create(name: "copyJar_v${project['version']}") {

    group GROUP_CHROMATERIAL

    def mostCurrentJarFile = "ChroMATERIAL-${project['version']}.jar"

    // comment this out and there are not errors, but I need to do this copy manually
    copy {
        into '/'    // Copy into project's root folder
        from 'build/libs', {
            include mostCurrentJarFile
            rename mostCurrentJarFile, 'ChroMATERIAL.jar'
        }
    }

}

错误

FAILURE: Build failed with an exception.

* Where:
Build file 
  '/home/ciscorucinski/IdeaProjects/ChroMATERIAL/ChroMATERIAL/build.gradle' line: 100

* What went wrong:
A problem occurred evaluating project ':ChroMATERIAL'.
> Could not copy file '/home/ciscorucinski/IdeaProjects/ChroMATERIAL/ChroMATERIAL/build/libs/ChroMATERIAL-2.5.1.jar' to '/ChroMATERIAL.jar'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 0.139 secs
/ChroMATERIAL.jar (Permission denied)
오후 12:20:39: Task execution finished 'copyJar_v2.5.1'.

我尝试了什么

我一直在使用 UI 修改 IdeaProjects 内的插件项目文件夹的文件权限。

  1. 我给了每个人Create and delete files 权限,我给了Change Permissions for Enclosing Files...
  2. 每个人都有 Read and write 访问文件和 Create and delete files 访问文件夹的权限。
  3. 点击Change
  4. 再次运行 Gradle 脚本...同样的错误消息

想法

  • Linux 似乎不允许 Gradle 修改这些文件。我可以注释掉代码,自己做所有事情,但我需要让 Gradle 有更高的控制权。不知道是怎么回事。
  • 我注意到当我返回Change Permissions for Enclosing Files... 时,显示的权限不是我选择的! Others 拥有对文件的Read-only 访问权限和对文件夹的Access files 访问权限。我不知道这是常见的 Ubuntu 行为、错误还是其他原因。
    • 很高兴知道如何在解决此问题时尽可能限制访问。

【问题讨论】:

    标签: linux gradle permissions


    【解决方案1】:

    的确如此——您不能(也不应该)将文件复制到 linux 机器的根文件夹中。如果您以 sudo 的身份运行脚本,则可以,但这是个坏主意。

    已编辑

    由于要复制到项目的根目录,可以使用${projectDir}或${rootDir}。

    此外,您应该能够通过使用内置的 Copy 任务来执行此操作而无需关闭 - 并且它使您的脚本更清晰,恕我直言:

    task copyClientLoc(type: Copy) {                  
        from "build/libs/"
        into "${rootDir}"
        include "ChroMATERIAL-${project['version']}.jar"
        fileMode = 0644
    }
    

    【讨论】:

    • 我的任务名称设置为动态的。作为次要预防措施,我正在复制正确的版本。我以为我不能使用内置的复制任务。我错了吗?
    • Windowsinto '/'表示项目的根文件夹。你的意思是Linux上的into '/'是指Linux中的根文件夹??好像不太对!?似乎是巨大的不兼容问题
    • 在Linux中,/是系统的根目录——相当于Windows中的“C:\”。在 Gradle 中,项目的根文件夹由 ${projectDir} 给出,对于多项目构建,则由 ${rootDir} 给出。
    • 已编辑将文件复制到项目的根目录。这是build.gradle文件所在的目录。
    • 为什么你的任务名称需要是动态的?这将使它几乎不可能用作其他任务的依赖项?
    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多