问题描述
我想弄清楚 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 from
是 label,但什么时候才能真正使用该标签?更何况 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"]))
(如果传递了地图,您可以省略地图文字周围的 []
)