我有一个带有build.gradle
和good
任务的简约bad
文件。我想明白为什么这不起作用,给我一个奇怪的错误:
def owner = 1
task('bad') {
doLast {
println "My owner is, ${owner}"
}
}
task good {
doLast {
println 'This is good'
}
}
这是输出:
FAILURE: Build failed with an exception.
* Where:
Build file 'test\build.gradle' line: 4
* What went wrong:
A problem occurred evaluating root project 'test'.
> No signature of method: build_6t4ha87o2gnjb2kllhp0wwfpi$_run_closure1.doLast() is applicable for argument types: (build_6t4ha87o2gnjb2kllhp0wwfpi$_run_closure
1$_closure4) values: [build_6t4ha87o2gnjb2kllhp0wwfpi$_run_closure1$_closure4@33517a36]
Possible solutions: doCall(), doCall(java.lang.Object), collect(), collect(), isCase(java.lang.Object), isCase(java.lang.Object)
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
但是,只需从println删除对owner
的引用,或者只是将我的全局owner
变量重命名为owner1
即可。看起来我在干扰一些gradle内部,但不确定如何。
我正在使用gradle 3.4进行此实验。
答案 0 :(得分:1)
如您所想,owner
在内部使用。具体来说,它是由Groovy类Closure
使用的。
您位于具有已定义Closure
的任务中,因此,当您将owner
声明为def
时,编译器不知道您是否引用了owner
变量或转换后的get方法getOwner()
(将在owner
中转换。)
您可以通过这种方式验证是否找到了以前发生的事件(删除了所有者声明后):
task verifyOwnerExistence {
println "Owner exists: ${owner != null}"
}