为什么可以';groovy不能处理花括号吗?

为什么可以';groovy不能处理花括号吗?,groovy,android-gradle-plugin,indentation,curly-braces,Groovy,Android Gradle Plugin,Indentation,Curly Braces,在Android Studio(可能还有任何)gradle文件中,以下代码可以工作: task build { } 一个微小的变化就会导致完全熔毁: task build { } 这在以前的其他线程中也出现过,但是在修复构建文件的上下文中。我的问题是为什么gradle/groovy不能处理这两种支撑风格?许多其他语言都能很好地处理它,那么这里有什么大不了的呢?如果有人读到这篇文章时感到疑惑,那么解决方法就足够简单了 task build \ { } 我只是想知道“为什么”…在错误消息中它实

在Android Studio(可能还有任何)gradle文件中,以下代码可以工作:

task build {
}
一个微小的变化就会导致完全熔毁:

task build
{
}

这在以前的其他线程中也出现过,但是在修复构建文件的上下文中。我的问题是为什么gradle/groovy不能处理这两种支撑风格?许多其他语言都能很好地处理它,那么这里有什么大不了的呢?

如果有人读到这篇文章时感到疑惑,那么解决方法就足够简单了

task build \
{
}

我只是想知道“为什么”…

在错误消息中它实际上是正确的:

build file '.../build.gradle': 80: Ambiguous expression could be a parameterless closure expression, an isolated open code block, or it may continue a previous statement;
     solution: Add an explicit parameter list, e.g. {it -> ...}, or force it to be treated as an open block by giving it a label, e.g. L:{...}, and also either remove the previous newline, or add an explicit semicolon ';' @ line 80, column 1.
由于Groovy语法允许将lambda作为最后一个参数的方法作为look line语言构造,因此以下代码块:

task build {}
task build2(type: Copy) {}
与更规则的形式相同:

task build({})
task build(type: Copy, {})
现在,您并不是真的希望那里的大括号分隔一个常规代码块,而是一个Groovy lambda,它应该作为参数传递给
build
方法

然而,从外观上看,Groovy无法确定它是作为参数传递给前一行中的方法的lambda,还是在换行时作为不相关的代码块传递。这就是错误消息中描述的模糊性,就在那里

按照错误消息中的建议,您还可以使用以下语法,而不是转义新行字符的语法:

task build
{ -> 
}

最后,用于调用动态方法的
task
关键字(在您的示例中名为
build
)不是Groovy特有的,而是Gradle DSL特性。

Gradle构建脚本是DSL,严格来说不是Groovy脚本或类文件。我觉得这是一个bug,但是,它可能值得发布为一个?但是
doLast\n{…
工作…当解析任务定义时,认为这更像是DSL问题有趣…错误和它发生的原因在我看来是纯Groovy的,请参阅第2122行的方法(无论短类发生了什么,哈!)和相关的groovydoc:。可能是因为doLast是一个静态定义的(当然不是静态的)方法,它总是需要一个闭包参数()gradle中
任务
关键字之后调用的方法都是动态的,因此无法判断它们应该具有哪些参数?这肯定是一个“构建”任务DSL问题/实现选择,因为我使用的其他“关键字”都没有这个问题(构建脚本、插件、发布、工件等)是的。
buildscript
plugins
等都是静态定义方法的调用,都接受一个
Closure
类型参数。知道没有参数调用是不完整的,就没有歧义。
task
有点特殊,因为它有一个
Action
参数h是通过调用一个动态方法创建的(这里是
build
,但名称完全是任意的,没有区别),该方法的确切参数列表没有定义,因此不明确。动态方法调用被强制到
操作
实例的方式是一种渐变DSL复杂性。