本文由 简悦 SimpRead转码, 原文地址 jonnyzzz.com
Gradle Kotlin DSL 中的 Kotlin 任务
你在项目中使用 Kotlin 吗?让我们通过 Gradle Kotlin DSL 来使用 Kotlin DSL 配置项目的构建。在这篇文章中,我们将介绍几种配置技巧,我发现它们对我在 Gradle 中的 Kotlin 项目非常有用。
刚接触 Gradle Kotlin DSL?请查看上一篇文章,了解从 Groovy 迁移到 Kotlin 构建脚本的实用建议。
启用 Kotlin 插件
在 Gradle 构建中启用 Kotlin 的最快方法是
plugins {
kotlin("jvm") version "1.3.21"
}
Gradle 添加了 kotlin() 辅助函数来简化构建脚本。在不同的 kotlin 函数的帮助下,Kotlin 标准库的依赖关系也可以用同样的方式配置
repositories {
mavenCentral()
}
dependencies {
implementation(kotlin("stdlib"))
implementation(kotlin("reflect"))
}
你不需要包含 Kotlin 版本依赖。Gradle 的 Kotlin 插件会配置依赖解析,因此每个 Kotlin 标准库依赖都会使用相同的 Kotlin 版本。
配置 Kotlin 编译任务
你可以在Groovy的Gradle脚本中配置Kotlin。如下所示
compileKotlin {
kotlinOptions {
// ...
suppressWarnings = true
}
}
看到缺点了吗?是的,你可能看到了 compileKotlin 和 compileTestKotlin 任务,这意味着第二个任务没有配置。让我们在 Kotlin 脚本中解决这个问题。
不幸的是,上面的代码无法在 Kotlin Gradle DSL 中使用。我们需要显式地引用 "项目 "的 "任务 "属性中的任务元素。别忘了为项目配置所有 Kotlin 任务。
下面是我发现的一举配置 Kotlin DSL 中所有 Kotlin 任务的方法:
import org.jetbrains.kotlin.gradle.tasks.*
tasks.withType<KotlinCompile> {
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = listOf("-progressive")
}
}
tasks.withType<T>函数将为给定类型的每个现有和新添加的任务运行 lambda。
依赖关系中的 Kotlin 版本
通过传递依赖关系,我们可能会在项目中使用较旧的库。虽然 Kotlin 保证兼容性,但我还是希望尽可能使用实际的库。
让我们检查一下,确保我们使用了相同版本的 kotlin-stdlib 和其他 kotlin-* 库,比如 kotlin-reflect。
下面的 Gradle 脚本在 Kotlin 中就能实现这一点:
import org.jetbrains.kotlin.gradle.plugin.*
//https://youtrack.jetbrains.com/issue/KT-19788
val kotlinVersion by lazy {
plugins.withType<KotlinBasePluginWrapper>().map { it.kotlinPluginVersion }.distinct().single()
}
configurations.forEach { config ->
config.resolutionStrategy.eachDependency {
if (requested.group == "org.jetbrains.kotlin" && requested.name.startsWith("kotlin-")) {
useVersion(kotlinVersion)
}
}
}
你可能会问自己,为什么我们需要使用代码技巧来处理 kotlinVersion 变量?答案很简单,在 Gradle 中,我们不能在 plugins{..} 块中使用变量。这意味着我们无法在 plugins{..} 块和脚本的其他部分之间共享 Kotlin 版本作为变量。
而古老的 buildscript{..} 块则允许这样做。我更喜欢用更简短明确的 plugins{..} 块来配置构建中的 Gradle 插件。
你可能想对这个问题 KT-19788 进行投票,让 Gradle Kotlin 插件声明它的版本。
Kotlin-Dsl 插件和 buildSrc
还有一个由 Gradle 维护的实验性插件,可以帮助我们在 Gradle 中使用 Kotlin 进行构建逻辑开发。
该插件名为 "kotlin-dsl",你可以在文档中找到更多细节。
该插件是buildSrc项目的绝佳选择。它简化了设置,配置了所有依赖项,包括 kotlin-stdlib 和 Gradle 自己的构建脚本相关类。我们将在下一篇文章中详细讨论 "buildSrc "项目和我的发现。
结论
Kotlin作为一种静态类型编程语言,在编写Gradle构建脚本时似乎发挥了很好的作用。得益于静态类型推断,Kotlin 编译器能更早地检测到错误,并显示有用的编译错误信息和警告。集成开发环境和编译器都会使用类型信息来推断给定作用域中的可用函数和属性,即使是在带有接收器的第五层嵌套 lambda 中也是如此。
您可能还记得上一篇文章,我们的示例项目完全是用 Kotlin 编写的,在那篇文章中我们学习了如何在 Kotlin 中配置 Kotlin 编译任务和依赖关系。
我将在接下来的文章中介绍更多内容,敬请期待!查看
。