玩转Gradle构建工具(八)、过渡到Kotlin

272 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

前言

本系列目录

  1. Task
  2. Project、Task常用API
  3. 文件操作
  4. 依赖管理
  5. 多模块构建
  6. 插件编写
  7. SpringBoot插件源码分析
  8. 过渡到Kotlin

目前后端使用Kotlin貌似还比较少,但Android已经全面推行Kotlin了,现在Android库大部分都使用Kotlin编写了,而Gradle在后端也越来越多,SpringBoot也已经从Maven改为Gradle了,你还不使用在等什么?,而我也看过很多人对他的评价,表示难,确实比Maven难很多,原因是他的思想很平常我们熟悉的不一样,但无论如何,学习他总没错,而官网也表示Gradle+Kotlin = ⚡️ 🚀️

image.png

Kotlin也越来越流行,Gradle也支持Kotlin写脚本,而对应的脚本文件名变成了build.gradle.kts,两种只是语法上有一些差别,而在官网中,每一个例子都给了两种语言的写法,SpringBoot官网中也同样这样做(SpringBoot对Gradle打包插件的配置),我们在特殊情况下才会自己自定义一些配置,这就需要对他们有所了解,而大部分我们都是根据Gradle、SpringBoot所要求的去写,他们也都给出了怎么配置,只需要复制过来就行。

image.png

区别

比如groovy使用def定义变量,而kotlin使用val或者var。

val taskA =tasks.register("taskA")
println(taskA.name)

还有我们平常写依赖的时候和以前也有所不一样,需要加(),如下是kotlin的写法。

implementation("org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2")

下面报错
implementation "com.fasterxml.jackson.module:jackson-module-kotlin"

而下面是groovy下的写法,但groovy也可以使用kotlin那种方式,不会报错。

dependencies {
   implementation group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf', version: '2.7.0'
   implementation 'org.springframework.boot:spring-boot-starter'
   implementation ("org.springframework.boot:spring-boot-starter-web")
   testImplementation "org.springframework.boot:spring-boot-starter-test"
}

平常引入依赖时,都会去maven仓库中搜索依赖时,maven贴心的为我们准备了好几种依赖方式,如下,最常用的就是前四种。

image.png

如果要自定义任务,就要熟悉kotlin语言,这里只做一个演示,比如下面是一个简单的循环,Kotlin引入了一个非常实用的字符拼接方式,同js中使用两个`字符括起来一样,可以在双引号中通过${}人引入外部变量,比使用+要美观不少。

val taskA =tasks.register("taskA")
taskA.get().doLast{
    for (i in 0 ..4) {
        println("当前循环${i}")
    }
}

还有配置任务的语法是Groovy和Kotlin最明显不同的地方,比如Kotlin使用下面这种方式配置任务。

tasks.jar {
    archiveFileName.set("test.jar")
}

而groovy直接可以使用=赋值。

tasks.jar {
    archiveFileName = 'test.jar'
}

而由于Kotlin是一种静态类型语言,因此如在使用named获取指定任务时需要指定任务的类型,否则,脚本将无法编译,因为kotlin会自动推断为Task类型,在上面例子中archiveFileName属于AbstractArchiveTask,并且Jar任务继承他,如果我们不指定任务类型,则访问不到archiveFileName属性,但也可以指定为AbstractArchiveTask他的父类。

tasks.named<AbstractArchiveTask>("jar"){
    archiveFileName.set("test.jar")
}
or
tasks.named<Jar>("jar"){
    archiveFileName.set("test.jar")
}

如果不知道任务类型,可以使用下面命令来获取。

./gradlew help --task jar

> Task :help
Detailed task information for jar

Path
     :jar

Type
     Jar (org.gradle.api.tasks.bundling.Jar)

Description
     Assembles a jar archive containing the main classes.

Group
     build


脚本参考

参考文章还得是官网,Gradle分别提供了groovy和kotlin上的参考文章,如下。

groovy:docs.gradle.org/current/use…

kotlin:docs.gradle.org/current/use…

在官网中也提到了Kotlin和Groovy语言有一些差异,可能需要手动转换一下,如

  • Groovy 字符串可以用单引号'string'或双引号引起来,而Kotlin需要双引号"string"
  • Groovy 允许在调用函数时省略括号,而Kotlin总是需要括号,就如上面我们所说,implementation就是一个函数,在调用时,kotlin必须加括号。