如何将Gradle构建脚本语言从Groovy迁移到Kotlin

关于为何要使用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的各项基础知识和用法

1. 当Groovy遇到Kotlin

Kotlin语言是静态类型的,并且具有内建的空安全性,另一边Groovy本质上是高度动态的。

  • Kotlin语言比Groovy语言更加严格
  • Kotlin DSL比Groovy DSL更严格

两种DSL都提供了与Gradle的动态可扩展模型以及运行时进行交互的手段。

使用Kotlin DSL:

  • 更多的套路来实现动态化
  • 更加的安全以及更多的工具

在Gradle的最佳实践中倾向于更多的声明式构建,更少的动态构造,这正是是Kotlin大放光彩的地方,从这个意义上来说,Kotlin DSL将会鼓励并促进Gradle的这个最佳实践。

这使得在使用Kotlin DSL去应用Gradle最佳实践时将变得更加容易。

2. 品尝差异

首先,我们将从脚本的角度来看Groovy DSL和Kotlin DSL之间的主要区别。

  • 文件名
  • 插件
  • 任务处理
  • 依赖及配置
  • 属性
  • 集合与容器
  • 扩展

2.1 文件名

  • Groovy DSL脚本文件扩展名为*.gradle
  • Kotlin DSL脚本文件扩展名为*.gradle.kts

要使用Kotlin DSL,只需要将 build.gradle 改为 build.gradle.kts即可。

settings.gradle 文件也可以被重命名为settings.gradle.kts

在多项目构建中,你可以在一部分模块中使用Groovy DSL(使用build.gradle文件),在另外一些模块使用Kotlin DSL(使用build.gradle.kts文件),所以你不需要被迫同时迁移所有的东西。

2.2 使用核心插件

使用 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")

2.3 使用外部插件

仍然使用 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")

2.4 配置任务

在这里Groovy和Kotlin开始有所不同了,由于Kotlin是一种静态类型的语言,如果你想通过使用自动完成功能来发现可用的属性和方法从而在静态类型中受益,你需要知道并提供想要配置任务的类型。

以下将展示如何配置jar任务的单个属性:

//Groovy
jar.archiveName = 'foo.jar'
//Kotlin
tasks.getByName<Jar>("jar").archiveName = "foo.jar"

注意,明确指定任务的类型是必须,否则脚本将不会编译,因为推断的类型jar将会是Task,而且archiveName属性

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值