赞
踩
关于为何要使用Kotlin DSL来编写Gradle构建脚本大家可以看看这篇文章Kotlin Meets Gradle
总的来说Kotlin和Groovy语言有着很大的差异,但各自都有自己的优势。
Kotlin是静态类型语言,并且具有内置的空安全性,还具最牛的IDE工具(IDEA),包含从自动完成到重构之间的一切。
另一方面,Groovy本质上是高度动态的,因此非常灵活,但缺乏合适的IDE工具给予支持。
Gradle是在Java的JVM之上实现的,而Groovy DSL和Kotlin DSL都是在Gradle Java API的基础上实现的。
注意:
如果你想在开始之前先了解Kotlin语言,或许你需要一些参考资料,那么Kotlin参考文档(中文文档)就是你所需的。并且在Kotlin Koans中提供了一种有趣的方式来学习Kotlin,你在其中能快速的学习到Kotlin的各项基础知识和用法
Kotlin语言是静态类型的,并且具有内建的空安全性,另一边Groovy本质上是高度动态的。
两种DSL都提供了与Gradle的动态可扩展模型以及运行时进行交互的手段。
使用Kotlin DSL:
在Gradle的最佳实践中倾向于更多的声明式构建,更少的动态构造,这正是是Kotlin大放光彩的地方,从这个意义上来说,Kotlin DSL将会鼓励并促进Gradle的这个最佳实践。
这使得在使用Kotlin DSL去应用Gradle最佳实践时将变得更加容易。
首先,我们将从脚本的角度来看Groovy DSL和Kotlin DSL之间的主要区别。
*.gradle
。*.gradle.kts
。要使用Kotlin DSL,只需要将 build.gradle
改为 build.gradle.kts
即可。
settings.gradle
文件也可以被重命名为settings.gradle.kts
。
在多项目构建中,你可以在一部分模块中使用Groovy DSL(使用build.gradle
文件),在另外一些模块使用Kotlin DSL(使用build.gradle.kts
文件),所以你不需要被迫同时迁移所有的东西。
使用 plugin
块:
//Groovy
plugins {
id 'java'
id 'jacoco'
}
//Kotlin
plugins {
java
id("jacoco")
}
正如你在jacoco
示例中所看到的,Groovy和Kotlin可以使用相同的语法(当然,除了Kotlin中必须使用的双引号和括号外)。
但是,Kotlin DSL还为所有Gradle核心插件定义了扩展属性,所以你可以直接使用它们,如上例所示的java
。
你也可以使用较旧的apply
语法:
//Groovy
apply plugin: 'checkstyle'
//Kotlin
apply(plugin = "checkstyle")
仍然使用 plugins
块:
//Groovy
plugins {
id 'org.springframework.boot' version '2.0.1.RELEASE'
}
//Kotlin
plugins {
id("org.springframework.boot") version "2.0.1.RELEASE"
}
较旧的apply
语法:
//Groovy
buildscript {
repositories {
gradlePluginPortal()
}
dependencies {
classpath("gradle.plugin.com.boxfuse.client:gradle-plugin-publishing:5.0.3")
}
}
apply plugin: 'org.flywaydb.flyway'
//Kotlin
buildscript {
repositories {
gradlePluginPortal()
}
dependencies {
classpath("gradle.plugin.com.boxfuse.client:gradle-plugin-publishing:5.0.3")
}
}
apply(plugin = "org.flywaydb.flyway")
在这里Groovy和Kotlin开始有所不同了,由于Kotlin是一种静态类型的语言,如果你想通过使用自动完成功能来发现可用的属性和方法从而在静态类型中受益,你需要知道并提供想要配置任务的类型。
以下将展示如何配置jar
任务的单个属性:
//Groovy
jar.archiveName = 'foo.jar'
//Kotlin
tasks.getByName<Jar>("jar").archiveName = "foo.jar"
注意,明确指定任务的类型是必须,否则脚本将不会编译,因为推断的类型jar
将会是Task
,而且archiveName
属性
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。