Включить скрипты с Gradle Kotlin DSL - PullRequest
2 голосов
/ 25 марта 2019

Я пытаюсь начать использовать Kotlin DSL с gradle в проекте со следующими ограничениями:

  • Проект имеет разные модули (более того: иногда эти модули используют разные плагины, однако, если два проекта используюттот же плагин, тогда версии плагинов одинаковы).
  • Проект имеет только внутренние корпоративные репозитории (например, мы не используем jcenter напрямую, мы используем прокси для него).

Что мы имеем с Groovy:

  • Некоторые общие элементы конфигурации исключены из отдельных сценариев.Пожалуйста, проверьте пример ниже.
  • Модули Gradle включают эти файлы.

В результате (только на основе моего примера):

  • Мы неНе нужно добавлять одинаковые строки кода в каждый модуль.
  • Большинство проектов имеют различия только со списком зависимостей.

Я пытался воспроизвести то же самое с Gralde KTS и получилследующие трудности:

  • Я не могу применить плагин во включаемом файле и использовать его в модуле.В этом случае я получаю ошибку компиляции (потому что типы плагинов не добавляются в скрипт модуля).
  • Я не могу извлечь константы для чего-то общего, чтобы использовать их в каждом скрипте (root build.gradle.kts включительно)).В Groovy я могу просто использовать переменную типа springBootVersion, однако в Kotlin Script мне нужно создать одно и то же свойство в каждом файле модуля.
  • Скомпилированные плагины сценариев не работают без общедоступных репозиториевдоступ (например, я не могу настроить файл общего сценария с идеей «просто используйте встроенную версию Kotlin Script по умолчанию, загрузите все зависимости с этих URL-адресов: ...».

Включите образец файла:

apply plugin: 'kotlin'

compileKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

compileTestKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

Пример модуля Gradle:

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
}

Вопросы:

  • Как задать все общие константы (например, версии зависимостей)в отдельный файл, чтобы включить их, просто используя что-то вроде springBootVersion или Constants.springBootVersion с проверками во время компиляции?
  • Как извлечь извлечение плагина, применяемое к сценариям включения (чтобы избежать перегрузки скриптов модуля Gradle)?
  • Как использовать предварительно скомпилированные плагины сценариев без доступа к общедоступным глобальным репозиториям?

Дополнительные ссылки:

1 Ответ

7 голосов
/ 25 марта 2019

В настоящее время в Kotlin DSL есть ограничения (5.3), которые не позволяют везде проверять время компиляции.Чтобы Kotlin DSL работал, он должен добавить расширения поверх API Gradle и не может сделать это волшебным образом.Прежде всего вам нужно пройти страницу Kotlin DSL Primer , чтобы понять это.

Как мне извлечь плагин, применяемый к сценариям включения (чтобы избежать перегрузки сценариев модуля Gradle)?

Один из способов сделать это - использовать предварительно скомпилированные сценарии сборки с плагином Kotlin DSL.Для этого вам нужно переместить ваш скрипт в проект $rootDir/buildSrc.Вот как это может выглядеть:

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

Затем поместите ваш общий скрипт так:

// $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"
}

Затем вы можете применить этот скрипт как к плагину, подобному этому:

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

Как я могу использовать предварительно скомпилированные плагины скриптов без доступа к общедоступным глобальным репозиториям?

Настройка пользовательских репозиториев для плагина скомпилированных скриптов ничем не отличается от вашего обычного скрипта сборки.Сделайте это так:

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

Другой путь, если вы не хотите использовать предварительно скомпилированные плагины, это явно настроить расширения.Вы можете сделать это так:

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

А в основном скрипте:

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

Как я могу поместить все общие константы (например, версии зависимостей) в отдельный файлвключить их, просто используя что-то вроде springBootVersion или Constants.springBootVersion с проверками во время компиляции?

В настоящее время нет хорошего способа сделать это.Вы можете использовать дополнительные свойства, но это не гарантирует проверки времени компиляции.Примерно так:

// $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"

И вы можете использовать его так:

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

А в вашем модуле:

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