使用赋值"="和括号{}感到困惑

Sub*_*bby 28 groovy gradle

我是gradle的新手(也是groovy),我几乎没有落后于某些概念,并且不知道它是否与groovy或gradle相关以及谷歌有哪些关键词,以获得一些帮助.

我经常偶然发现:

android {
    [some configuration]
}
Run Code Online (Sandbox Code Playgroud)

那么什么是android?一类?命名空间?一系列属性?

但更令人困惑的是:

有时我看到的配置看起来像:

minSdkVersion 19
Run Code Online (Sandbox Code Playgroud)

这似乎是一项任务,但没有一个等号.有时候会有像等号一样的作业

source = "folder/file.java"
Run Code Online (Sandbox Code Playgroud)

所以这很令人困惑.等号与没有等号.所有这些支架的东西.

我看到的所有常规介绍都没有涵盖这些主题.那么它是一些gradle约定还是真正的groovy语法?

tim*_*tes 16

在Groovy中,括号有时是可选的.

第一个android是将闭包传递给Method.即:

void android( Closure config ) {
    println "In Android : ${config()}"
}

android {
    'tim'
}
Run Code Online (Sandbox Code Playgroud)

打印:In Android : tim它与调用相同:

android( {
    'tim'
} )
Run Code Online (Sandbox Code Playgroud)

如果你把parens放回去.

第二个示例minSdkVersion是相同的,但它将一个Integer传递给一个方法.

void minSdkVersion( Integer version ) {
    println "In MinSdkVersion : $version"
}

minSdkVersion 19
// same as minSdkVersion( 19 )
Run Code Online (Sandbox Code Playgroud)

这样打印 In MinSdkVersion : 19

最后一个示例是将属性设置为String(正如您所期望的那样)

  • 许多Gradle类型都有为每个属性生成的方法,因此可以编写`minSdkVersion 19`而不是`minSdkVersion = 19`.`foo {prop1 = ...; prop2 = ...; ...}`是配置名为`foo`的对象的语法.它通常与`foo.prop1 = ...相似但更简洁; foo.prop2 = ...; ...`.知道`foo`的类型,可以在[Gradle Build Language Reference](http://gradle.org/docs/current/dsl/index.html)中查找其方法和属性,或者,在一个外部插件,如Android插件,在插件的文档中. (11认同)
  • 请注意,语法`<property> <value>`并不总是与使用赋值运算符`<property> = <value>`相同,它总是调用属性的setter.自动生成的方法通常用于向现有集添加新参数,而setter可以替换现有值.这种行为的一个例子是Gradle任务上的'onlyIf {...}`/ onlyIf = {...}`. (2认同)

And*_*ich 5

严格来说,它android是一个接受闭包(代码块)的动态方法,可以访问android插件/任务配置的某些内部表示.因此,在该闭包内,您最终要么调用其他方法,要么对可用的属性进行赋值.如果没有等号,那么它是一个方法调用,如果存在那么它是一个纯属性.您可以通过查看插件文档或代表它的对象来获得这个想法.

我想你可以安全地将这个块称为android插件配置.因为它是代码所影响的.