Gradle 文件重命名导致循环依赖错误 - 为什么?
Gradle file rename causes circular dependency error - Why?
我想将输入文件存储在使用 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 错误?
请不要提出替代解决方案;我通过避免重命名的需要解决了原来的问题。但是我想学习;我觉得我错过了一些重要的东西。
我在 Gradle 论坛上得到了 Gradleware 的 Sterling Greene 的 answer。基本上,循环依赖的原因是这样的(用我自己的话说):
闭包总是 return 最后一个值,所以 from {}
闭包 return 是 rename
的值。顺便说一句,rename
return 是对任务本身的引用(为什么它会那样做,我不知道,但这就是 its docs say)。所以任务本身被添加到它的复制列表中,我们有一个循环依赖。
解决方案是稍微修改闭包:
from(file1) {
//file1;
rename { String fileName -> fileName.replace('file1.txt', 'file2.txt'); }
}
这运行没有问题,因为它使用了 from()
方法的重载变体,它总是将给定文件添加到要复制的列表中,而不是关闭的结果。总而言之,这并不完全直观,但确实如此。
好吧,我也遇到了同样的错误,我认为错误是由于文件重命名引起的,但在我的例子中,错误是由于对模块的双重依赖(:后端)和 java 库对 android 的依赖module(:app) 我按照以下步骤对它进行了排序:
- 按Ctrl+Shift+ Alt+S 或转到 File->Project Structure 这将打开项目结构对话框。
- 在左侧面板,在 modules 部分下选择 java 库(例如 jjLibrary)有两个编译依赖项 :app 和 :backend 只需要删除这两个 dependencies.As :backend 已经编译依赖于 java 库和 :app 是 android 模块不能依赖 java library.Press 好的。
- 保存并同步 gradle 个文件 ..
错误消失了..希望这有帮助!!!干杯
我想将输入文件存储在使用 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 错误?
请不要提出替代解决方案;我通过避免重命名的需要解决了原来的问题。但是我想学习;我觉得我错过了一些重要的东西。
我在 Gradle 论坛上得到了 Gradleware 的 Sterling Greene 的 answer。基本上,循环依赖的原因是这样的(用我自己的话说):
闭包总是 return 最后一个值,所以 from {}
闭包 return 是 rename
的值。顺便说一句,rename
return 是对任务本身的引用(为什么它会那样做,我不知道,但这就是 its docs say)。所以任务本身被添加到它的复制列表中,我们有一个循环依赖。
解决方案是稍微修改闭包:
from(file1) {
//file1;
rename { String fileName -> fileName.replace('file1.txt', 'file2.txt'); }
}
这运行没有问题,因为它使用了 from()
方法的重载变体,它总是将给定文件添加到要复制的列表中,而不是关闭的结果。总而言之,这并不完全直观,但确实如此。
好吧,我也遇到了同样的错误,我认为错误是由于文件重命名引起的,但在我的例子中,错误是由于对模块的双重依赖(:后端)和 java 库对 android 的依赖module(:app) 我按照以下步骤对它进行了排序:
- 按Ctrl+Shift+ Alt+S 或转到 File->Project Structure 这将打开项目结构对话框。
- 在左侧面板,在 modules 部分下选择 java 库(例如 jjLibrary)有两个编译依赖项 :app 和 :backend 只需要删除这两个 dependencies.As :backend 已经编译依赖于 java 库和 :app 是 android 模块不能依赖 java library.Press 好的。
- 保存并同步 gradle 个文件 ..
错误消失了..希望这有帮助!!!干杯