Incluir scripts con Gradle Kotlin DSL

Manushin Igor:

Estoy tratando de empezar a utilizar Kotlin DSL con Gradle en el proyecto con las siguientes restricciones:

  • Proyecto cuenta con diferentes módulos (por otra parte: a veces estos módulos utilizan diferentes plugins, sin embargo, si dos proyectos utiliza el mismo complemento a continuación la versión de los plugins son los mismos).
  • Proyecto tiene sólo repositorios corporativos internos (por ejemplo, no utilizamos JCentro directamente, utilizamos proxy para él).

Lo que tenemos con Groovy:

  • Algunos elementos configuraciones comunes se excluyen a las secuencias de comandos separados. Por favor, compruebe el siguiente ejemplo.
  • Gradle módulos incluyen estos archivos.

Como resultado de ello (sólo se basa en mi ejemplo):

  • No necesitamos añadir las mismas líneas de código en el que cada módulo.
  • La mayoría de los proyectos tienen menor diferencia con la lista de dependencias.

Traté de reproducir el mismo con Gralde KTS y recibió las siguientes dificultades:

  • Soy incapaz de aplicar el plugin en el archivo de inclusión y utilizarlo en el módulo. En este caso recibo error de compilación (porque los tipos de plugins no se agregan en el script del módulo).
  • Soy incapaz de extraer constantes al algo común el uso de ellos en el cada guiones (raíz build.gradle.ktsinclusive). Con maravilloso que sólo puede utilizar variables como springBootVersion, sin embargo, con Kotlin guión que tiene que crear la misma propiedad en el archivo de cada módulo.
  • Plugins de script precompilados no funciona sin acceso repositorios públicos (por ejemplo, no soy capaz de configurar archivo de script común con la idea de "sólo tiene que utilizar por defecto incrustado versión Kotlin Script, descarga todas las dependencias de estas direcciones: ...".

Incluir archivo de muestra:

apply plugin: 'kotlin'

compileKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

compileTestKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

Gradle muestra de módulo:

apply from: "${rootDir}/gradle/include/kotlin-common-include.gradle"

dependencies {
    compile project(':my.project.libraries.common') 

    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springBootVersion
}

preguntas:

  • ¿Cómo puedo poner todas las constantes comunes (como las versiones de dependencia) al archivo separado para incluirlos simplemente mediante el uso de algo así springBootVersiono Constants.springBootVersioncon controles de tiempo de compilación?
  • ¿Cómo puedo extraer plugin de aplicar a los guiones incluyen (para evitar la sobrecarga de Gradle guiones de módulos)?
  • ¿Cómo puedo usar plugins de script precompilados y sin acceso público repositorios global?

Enlaces superiores:

Izbassar Tolegen:

Existen limitaciones en Kotlin DSL actualmente (5.3) que impide tener comprobaciones en tiempo de compilación en todas partes. Para que Kotlin DSL a trabajar tiene que añadir extensiones en la parte superior de la API Gradle y no puede hacerlo mágicamente. En primer lugar tiene que ir a través Kotlin DSL Primer página para entenderlo.

¿Cómo puedo extraer plugin de aplicar a los guiones incluyen (para evitar la sobrecarga de Gradle guiones de módulos)?

La única manera de hacerlo es utilizar scripts de construcción precompilados con Kotlin DSL Plugin. Con el fin de hacerlo tiene que mover su script en $rootDir/buildSrcproyecto. Aquí la forma en que podría ser:

// $rootDir/buildSrc/build.gradle.kts
plugins {
  `kotlin-dsl`
}
repositories {
   maven {
     url = uri("http://host:8082/artifactory/...")
  }
}

A continuación, poner su escritura común así:

// $rootDir/buildSrc/src/main/kotlin/common.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
  kotlin("jvm") version "1.3.21"
}
tasks.compileKotlin {
  kotlinOptions.jvmTarget = "1.8"
}
tasks.compileTestKotlin {
  kotlinOptions.jvmTarget = "1.8"
}

A continuación, puede aplicar este script como a un plugin de esa manera:

// $rootDir/build.gradle.kts
subprojects {
  apply(id = "common")
}

¿Cómo puedo usar plugins de script precompilados y sin acceso público repositorios global?

Configuración de repositorios personalizados para los scripts de pre-compilados complemento no es diferente que su escritura de la estructura habitual. Hacerlo así:

// $rootDir/buildSrc/settings.gradle.kts
pluginManagement {
  repositories.maven {
    url = uri("http://host:8082/artifactory/...")
  }
}

Al revés que si usted no desea utilizar plugins precompilados es extensiones configurar explícitamente. Puede hacerlo así:

// $rootDir/gradle/common.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
tasks.withType<KotlinCompile> {
  kotlinOptions.jvmTarget = "1.8"
}

Y en escritura principal:

// $rootDir/build.gradle.kts
subprojects {
  apply {
    plugin(KotlinPlatformJvmPlugin::class)
    from("common.gradle.kts")
  }
}

¿Cómo puedo poner todas las constantes comunes (como las versiones de dependencia) al archivo separado para incluirlos simplemente mediante el uso de algo así como springBootVersion o Constants.springBootVersion con comprobaciones en tiempo de compilación?

No hay una buena manera de hacerlo actualmente. Puede utilizar las propiedades adicionales, pero no va a garantizar cheques tiempo de compilación. Algo como eso:

// $rootDir/dependencies.gradle.kts

// this will try to take configuration from existing ones
val compile by configurations
val api by configurations
dependencies {
  compile("commons-io:commons-io:1.2.3")
  api("some.dep")
}

// This will put your version into extra extension
extra["springBootVersion"] = "1.2.3"

Y se puede utilizar de esta manera:

// $rootDir/build.gradle.kts
subprojects {
  apply {
    plugin<JavaLibraryPlugin>()
    from("$rootDir/dependencies.gradle.kts")
  }

Y en el módulo:

// $rootDir/module/build.gradle.kts
// This will take existing dependency from extra
val springBootVersion: String by extra
dependencies {
  compile("org.spring:boot:$springBootVersion")
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=173420&siteId=1
Recomendado
Clasificación