通往 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.* 导入!那个被公众谴责的、不友好的、基于字符串的 "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 发布了一系列针对多项目构建的改进中的第一个,包括使用 Kotlin 在 buildSrc 中定义自定义构建逻辑的能力。

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,欢迎!

讨论