-
Gradle不是一种语言?
不是,他只是一个使用Groovy语言的项目构建工具。且其内部代码都是执行代码,且真实的被运行了,并不是单纯的配置文件。且大量使用了闭包。
-
什么是闭包?
闭包就是可以传递的方法。 例如:
allprojects {
repositories {
google()
jcenter()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
这是我们Android中常见的配置文件,但实际上是这样子的
allprojects(new Action<Project>() {
@Override
void execute(Project project) {
project.repositories {
google()
jcenter()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
})
我们用闭包的方法传入了Action,lamada表达式其实传递的其实也是一个闭包,此处只是个简单的例子。
再来看下面这一段
dependencies {
classpath "com.android.tools.build:gradle:4.2.0-alpha03"
}
这又是什么呢?但其实写过Kotlin的同学们应当很熟悉了。{}内其实有个隐藏对象it,
所以我们可以如下解析上面的代码
dependencies ({ it->
it .add('classpath' , "com.android.tools.build:gradle:4.2.0-alpha03")
})
it具体指的就是其中的一个回调 ——— dependencyHandly了,闭包不仅可以传递方法还有对象,甚至可以隐藏一些方法名,只要不发生歧义即可。
到此其实已经很清晰了,原理就是方法调用。
下面看子包下的配置文件
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
}
-
implementation 和 compile 的区别?
compile会依赖传递,implementation不会。比如说我们子引入了我们写的一个模块
compile project(":http")是我们封装的网络请求,其中使用了OkHttp,retrofit,room,协程拓展....,我们使用compile之后,我们主包可以使用子模块引入的库。这会导致我们引入多个相同的库。我们多个子模块引入相同的库导致每次编译的到这些库的时候会导致缓存无效,重新编译,原因是Grooovy不会去确认你其他包是否使用了你传递的这个库,引入了我们的http就完整编译。
目前compile已经被遗弃了改名为api,如果我们有些库经常变化,如我们正在完善的网络请求库,可以使用api代替implementation引入依赖。