Gradle Script Kotlin 1.0 之路

目录

介绍

五个月前,我们发布了 Gradle Script Kotlin 的第一个预发布版本,我们认为现在是回顾自那时以来我们取得的进展的好时机。在那段时间里,我们又发布了八个预发布版本,而且通往 1.0 的道路每天都变得更加清晰。那么,让我们回顾一下我们迄今为止所取得的成就以及我们未来的方向,好吗?

v0.1.0 #

你可能还记得,这是我们的 hello-world 示例在我们第一次发布时的样子

import org.gradle.api.plugins.*
import org.gradle.script.lang.kotlin.*

apply<ApplicationPlugin>()

configure<ApplicationPluginConvention> {
    mainClassName = "samples.HelloWorld"
}

repositories {
    jcenter()
}

dependencies {
    "testCompile"("junit:junit:4.12")
}

噢,那个恼人的 org.gradle.script.lang.kotlin.* 导入!那个公开谴责的、对 IDE 不友好的、基于字符串的 "testCompile" 依赖配置!当然,对于那些勇敢尝试过的人来说,还有臭名昭著的 generateKtsConfigpatchIdeaConfig 任务,它们是让基于 Kotlin 的构建脚本在 IDEA 中工作所必需的。毫无疑问,那是早期阶段,它们带来了一些粗糙的边缘。

但尽管 0.1.0 版本存在缺陷,但其编程语言和 IDE 体验已经非常出色,让我们着迷。至于那些粗糙的边缘,我们已经看到了消除它们的方法,这促成了一个月后 0.2.0 版本的发布。

v0.2.0 #

随着隐式导入对工具友好的、基于字符串的依赖配置的替代方案hello-world 0.2.0 开始看起来简洁明了

apply<ApplicationPlugin>()

configure<ApplicationPluginConvention> {
    mainClassName = "samples.HelloWorld"
}

repositories {
    jcenter()
}

dependencies {
    testCompile("junit:junit:4.12")
}

无缝的项目导入意味着 IDEA 中基于 Kotlin 的构建开始开箱即用,并且误输入 generateKtsConfigpatchIdeaConfig 的日子已经一去不复返了。

也许最重要的是,0.2.0 版本对构建脚本依赖项和外部插件的支持使 Gradle Script Kotlin 成为许多实际项目的可行选择。

v0.3.0 #

0.3.0 是该项目的一个重要里程碑,因为它是第一个包含在生产 Gradle 发行版中的版本——Gradle 3.0,毫不逊色!

而 0.3.0 完全是关于 Kotlin 的!新的 Kotlin 1.1-M01 编译器,对基于 Kotlin 的插件buildSrc 目录的支持,以及一些甜蜜的 Kotlin-Groovy 互操作性原语

gradle.buildFinished(closureOf<BuildResult> {
    println("$action finished") // $action refers to BuildResult.getAction()
})

随着 Gradle 3.0 的发布,公共 Kotlin Slack 的 #gradle 频道参与度增加,这极大地帮助我们确定了接下来工作的优先级。

v0.3.1 #

我们注意到人们在配置依赖项时,苦于缺乏更类型安全和对 IDE 友好的方式,因此 0.3.1 版本带来了大大改进的依赖项 DSL

dependencies {

    default(group = "org.gradle", name = "foo", version = "1.0") {
        isForce = true
    }

    compile(group = "org.gradle", name = "bar") {
        exclude(module = "foo")
    }

    runtime("org.gradle:baz:1.0-SNAPSHOT") {
        isChanging = true
        isTransitive = false
    }

    testCompile(group = "junit", name = "junit")

    testRuntime(project(path = ":core")) {
        exclude(group = "org.gradle")
    }
}

升级到 Kotlin 1.1-dev-2053 显着提高了 IDEA 中代码辅助的性能,并且由于一位有价值的社区成员,第一个 Gradle Script Kotlin Android 示例得以发布。

v0.3.2 #

0.3.2 版本中,我们决定通过运行时代码生成 Kotlin 扩展来正面解决 可怕的 it 问题什么是可怕的 it 问题?copySpec 的使用为例。在 0.3.2 之前,人们会这样写

copySpec {
    it.from("src/data")
    it.include("*.properties")
}

这种语法读起来不太顺畅,并且偏离了 Gradle 一直以来以其流畅、可读的 DSL 而闻名的风格。但不用担心——在 0.3.2 版本中,it 消失了

copySpec {
    from("src/data")
    include("*.properties")
}

v0.3.3 和 v0.4.0 #

最近发布的 0.3.30.4.0 版本发布了对多项目构建的一系列改进中的第一个,包括在 buildSrc 中使用 Kotlin 定义自定义构建逻辑的能力

0.4.0 版本现已可用,并将随即将发布的 Gradle 3.2 发行版一起发布。

迈向 v1.0.0 #

你问接下来是什么?以下是我们即将发布的版本在三个关键领域的一些亮点

  1. 性能:通过缓存编译后的构建脚本来加快项目配置速度 (#31)。
  2. 易用性:插件贡献的扩展和约定类型安全访问器 (#159);全面的文档 (#106)。
  3. 便利性:插件的声明式和工具友好型应用,又名 plugins 块 (#168)。

总而言之,这就是我们设想的 Gradle Script Kotlin 1.0 中 hello-world 示例的样子

plugins {
    application
}

application {
    mainClassName = "samples.HelloWorld"
}

repositories {
    jcenter()
}

dependencies {
    testCompile("junit:junit:4.12")
}

你觉得怎么样?我们很想听听你的想法。

非常感谢到目前为止一路同行的所有人,如果您刚开始使用 Gradle Script Kotlin,欢迎您!

讨论