Gradle Kotlin DSL: Defina la versión de Kotlin en un lugar único

Para describir los scripts de compilation de Gradle, podemos usar Kotlin a través de los files build.gradle.kts . Es un problema común definir globalmente la versión de Kotlin que se utilizará, tanto en las dependencies como en la sección de plugin compilation.

Considere el siguiente código (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 } 

Como puede ver, la version kotlin (1.2.0 en este caso) está definida dos veces : dependencyVersion y pluginVersion , que a menudo no difiere . Debido a las restricciones de DSL, es imposible acceder a pluginVersion desde fuera del bloque de plugins o acceder a dependencyVersion desde dentro del bloque de plugins .

¿Cómo se puede extraer la cadena de versión, "1.2.0" en un solo lugar?

Puede extraer la versión de la class de complemento:

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

Hay una solución disponible, que busca la versión definida para el complemento kotlin y asigna esta a la variable externa. Lo siguiente demuestra esto:

 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 } 

La kotlinVersion así definida ahora se puede usar en las dependencies sin más problemas.

  • Cómo `continue` o` break` en una instrucción `when` dentro de un ciclo` while` usando Kotlin
  • Error de Kotlin al hacer reference a la actividad de la class interna
  • ¿Qué corresponde exactamente a una Regex creada con Regex.fromLiteral ()?
  • Propiedad de superclass no inicializada en class Derivada
  • Android: refactoriza muchos grupos de botones de radio en una actividad
  • NullPointerException en android.support.v4.app.NotificationCompatBase $ Action.getIcon ()
  • Genéricos en Kotlin con extiende
  • Kotlin: Obtiene la superclass del object de la class - error de inferencia del object
  • Trabajando con @Qualifier en las funciones de Kotlin
  • Cómo configurar el reempaquetado de los botines de spring con gradle-script-kotlin
  • ¿Cómo puedo crear un radiogrupo 2x2?