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

标签 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错误吗?
请不要提出替代解决方案;我避免了重命名,从而解决了原始问题。但是我想学习;我觉得我错过了一些重要的事情。

最佳答案

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

闭包总是返回最后一个值,因此from {}闭包返回rename的值。顺便说一句,rename返回对任务本身的引用(为什么不这样做,但这就是its docs say)。因此,任务本身被添加到要复制的事物列表中,并且我们具有循环依赖关系。

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

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

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

关于gradle - Gradle文件重命名导致循环依赖项错误-为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28874043/

相关文章:

c# - DLL 之间的循环依赖

c++ - 有没有办法为两个类声明共同的 friend 函数

javascript - Node.js 中如何处理互包含?

java - 从 Spring Batch 项目中的 build.gradle 获取值

gradle - 使用 Gradle (build.gradle) 运行 ANT build.xml 文件

android - 无法导入v7库

android - Android Studio Gradle不起作用

C++ 枚举问题和 g++ 中可能的循环依赖

c++ - 制作 : circular dependency dropped c++

android - 在没有 IDE 的情况下从我的服务器生成调试和签名的 Apk