传递给“buildscript”的 gradle DSL 闭包中的“apply from”部分是什么类型的代码元素?

问题描述

我想弄清楚 apply from 是什么类型的代码元素:

buildscript {
    apply from: rootProject.file("gradle/versions.gradle")
    repositories {
        google()
        ...
    }
    dependencies {
        classpath plugin.android_gradle_plugin
        ...
    }
}

this post 我了解到 buildscript gradle 函数是使用闭包调用的,因此我们可以添加省略的括号:

buildscript ({
    apply from: rootProject.file("gradle/versions.gradle")
    repositories ({
        google()
        ...
    })
    dependencies ({
        classpath plugin.android_gradle_plugin
        ...
    })
})

我一开始以为 apply fromlabel,但什么时候才能真正使用该标签?更何况 groovy 没有提到标签可以有空格。

然后我认为它可能是一个属性初始化(new Coordinates(latitude: 43.23,longitude: 3.67)),但 apply from一个闭包中。

最后我读到了“咖喱”,就像这样:

def ncopies = { int n,String str -> str*n }    
def twice = ncopies.curry(2)                    
assert twice('bla') == 'blabla'

因此在使用闭包时可以首先评估 apply from 部分,但即便如此,我仍然不知道 apply from标签还是某种赋值以及它的用途是什么。

>

那么,apply from 部分是什么类型的代码元素?

解决方法

TL;DR:这是一个以映射为参数的函数调用

apply from: rootProject.file("gradle/versions.gradle")

简称:

apply(from: rootProject.file("gradle/versions.gradle"))

("括号是可选的,如果没有歧义的话")

简称:

apply([from: rootProject.file("gradle/versions.gradle"]))

(如果传递了地图,您可以省略地图文字周围的 []