Gradle Kotlin DSL:在独特的地方定义Kotlin版本

为了描述Gradle构建脚本,我们可以通过build.gradle.kts文件使用Kotlin。 全局定义要使用 Kotlin版本是一个常见的问题,无论是在dependencies还是在构建plugin部分。

考虑下面的代码(Gradle 4.3.1):

 plugins { var pluginVersion = "1.2.0" kotlin("jvm").version(kotlinVersion) // more } var dependencyVersion = "1.2.0" dependencies { compile(kotlin("stdlib", kotlinVersion)) compile(kotlin("reflect", kotlinVersion)) testCompile(kotlin("test", kotlinVersion)) // more } 

正如你所看到的,kotlin version (在这种情况下是1.2.0)被定义了两次dependencyVersionpluginVersion ,通常不会有区别 。 由于DSL限制,无法从plugins块外部访问pluginVersion ,也无法从plugins块内访问dependencyVersion

如何将版本字符串"1.2.0"提取到一个地方?

您可以从插件类中提取版本:

 import org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper plugins { kotlin("jvm") version "1.2.0" } val kotlinVersion = plugins.getPlugin(KotlinPluginWrapper::class.java).kotlinPluginVersion 

有一个解决方法可用,它搜索为kotlin插件定义的版本,并将其分配给外部variables。 以下说明这一点:

 val kotlinVersion: String? by extra { buildscript.configurations["classpath"] .resolvedConfiguration.firstLevelModuleDependencies .find { it.moduleName == "kotlin-gradle-plugin" }?.moduleVersion } plugins { kotlin("jvm").version("1.2.0") //more } 

如此定义的kotlinVersion现在可以在没有进一步麻烦的dependencies使用。

在更高版本的Gradle中,您不再需要指定kotlin(stdlib|reflect|test)依赖项的版本,Kotlin插件将自动为您配置它们。

至于提取依赖到一个地方,有两个主要模式:

  • 定义要在buildSrc/src/main/kotlin/中的对象中共享的常量,并在构建脚本中使用该对象, buildSrc代码可用于整个脚本,包括plugins
  • 使用系统属性,您可以通过在gradle.propertiesgradle.properties名称来在gradle.properties定义一个系统属性systemProp. 你可以通过System.getProperties()来访问系统属性,例如:

     // build.gradle.kts plugins { val kotlinVersion by System.getProperties() println("Kotlin version is $kotlinVersion") } // gradle.properties systemProp.kotlinVersion=1.2.20