Gradle 脚本 Kotlin 1.0 之路

五个月前,我们 宣布了 Gradle 脚本 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 发布了 一系列多项目构建 的改进,包括 使用 Kotlin 在 buildSrc 中定义自定义构建逻辑 的能力。

0.4.0 现已推出,并将与即将发布的 Gradle 3.2 发行版一起发布。

走向 v1.0.0

您可能会问,接下来是什么?以下是我们即将发布的版本在三个关键领域的亮点

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

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

plugins {
    application
}

application {
    mainClassName = "samples.HelloWorld"
}

repositories {
    jcenter()
}

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

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

非常感谢所有一路陪伴我们的人,如果你刚开始使用 Gradle Script Kotlin,欢迎加入!

讨论