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.

  • Android - Error al convertir Bytecode en Dex con la versión min SDK
  • Kotlin con si no es nulo
  • Tema y estilo de Anko
  • ¿Cómo puedo establecer el JsName para el campo de respaldo de una propiedad en Kotlin?
  • ¿Cómo replace el doAsync de Anko, uiThread con las funciones de kotlin 1.1.0 kotlinx-coroutines-core lib?
  • ¿Cómo lidiar con los límites generics migrando de Java a Kotlin?
  • java.lang.NoClassDefFoundError: com.example.api.retrofit.AuthenticationInterceptor $ intercepte $ 1
  • ¿Cómo hacer que aparezca el segundo fragment de la list popBackStack?
  • ¿Cómo puedo anular un método de Java y cambiar la capacidad de anulación de un parámetro?
  • ¿Por qué no hay palabras key de concurrency en Kotlin?
  • apoya a la piruleta en Kotlin