Gradle文件重命名会导致循环依赖性错误 - 为什么?

时间:2015-03-05 09:17:26

标签: gradle circular-dependency

我想将输入文件存储在使用Gradle中Jar任务的子类创建的JAR中。输入文件应以不同的名称存储。

这是我的 build.gradle (完整的工作示例;首先创建dir1/file1.txt):

task myjar(type: MyJarTask);

class MyJarTask extends Jar {
  @InputFile
  File file1 = new File('dir1/file1.txt');

  public MyJarTask() {
    configure {
      baseName 'foo'
      from {
        file1;
        // comment out the next line to eliminate the error:
        rename { String fileName -> fileName.replace('file1.txt', 'file2.txt'); }
      }
    }
  }
}

通过gradle myjar运行此操作会出现以下错误:

* What went wrong:
Circular dependency between the following tasks:
:myjar
\--- :myjar (*)

(*) - details omitted (listed previously)

当我用rename注释掉这一行时,一切正常! (当然文件没有重命名。)

这种惊人行为的原因是什么?我们目睹了Gradle虫吗? 请不要建议其他解决方案;我通过避免重命名来解决原始问题。但我想学习;我觉得我错过了一些重要的东西。

2 个答案:

答案 0 :(得分:0)

Gradleware的Sterling Greene在Gradle论坛上得到了answer。基本上,循环依赖的原因是这个(用我自己的话说):

闭包始终返回最后一个值,因此from {}闭包返回rename的值。顺便提一下,rename会返回对任务本身的引用(为什么它会这样做,我不知道,但那是its docs say)。因此,任务本身被添加到要复制的事物列表中,并且我们具有循环依赖性。

解决方案是稍微修改闭包:

from(file1) {
  //file1;
  rename { String fileName -> fileName.replace('file1.txt', 'file2.txt'); }
}

这样运行没有问题,因为它使用from()方法的重载变体,它总是将给定文件添加到要复制的事物列表中,而不是闭包的结果。总而言之,这并不完全直观,但确实如此。

答案 1 :(得分:-1)

嗯我也有同样的错误我认为错误是由于文件的重命名,但在我的情况下错误是由于对模块(:backend)的双重依赖和对android模块(:app)的java库依赖我得到它排序以下步骤:

  1. Ctrl + Shift + Alt + S 或转到文件 - > 项目 结构这将打开项目结构对话框。
  2. 在左侧PANEL,在模块部分下选择java库(例如jjLibrary),有两个编译依赖:app :backend 必须删除这两个依赖项。因为:后端已经对java库有编译依赖,并且:app是android模块,它不能依赖java库。按Ok。
  3. 保存并同步gradle文件..
  4. 错误已经消失。希望这有助于!!!干杯