从任务引用全局变量会导致我的gradle任务失效

时间:2017-04-25 19:42:32

标签: gradle

我有一个带有build.gradlegood任务的简约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进行此实验。

1 个答案:

答案 0 :(得分:1)

如您所想,owner在内部使用。具体来说,它是由Groovy类Closure使用的。 您位于具有已定义Closure的任务中,因此,当您将owner声明为def时,编译器不知道您是否引用了owner变量或转换后的get方法getOwner()(将在owner中转换。)

您可以通过这种方式验证是否找到了以前发生的事件(删除了所有者声明后):

task verifyOwnerExistence {
    println "Owner exists: ${owner != null}"
}