Как настроить каждый проект Kotlin в многопроектной сборке Gradle?

У меня есть проект, в котором используется многопроектная сборка Gradle. Некоторые подпроекты написаны на Java, другие более новые - на Kotlin.

У нас есть один файл build.gradle верхнего уровня. Этот файл содержит следующую часть:

allprojects {
    plugins.withType(JavaPlugin) {
        // All the stuff that all Java sub-projects have in common
        ...
    }
    // All the stuff that all sub-projects have in common
    ...
}

Теперь мы хотели бы представить общие настройки для наших подпроектов Kotlin, но я не смог узнать, какой withType использовать.

Файлы build.gradle наших проектов Kotlin начинаются с

plugins {
    id "org.jetbrains.kotlin.jvm" version "1.3.0"
} 

но ни withType(org.jetbrains.kotlin.jvm), ни withType(KotlinProject) не работают.

Какой тип я должен там использовать? Спасибо!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
1
2 089
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете ссылаться на плагин Kotlin по его id, а не по его типу, как показано ниже:

allprojects {

    plugins.withType(JavaPlugin) {
        // All the stuff that all Java sub-projects have in common
        // ...
    }
    plugins.withId("org.jetbrains.kotlin.jvm") {
        // All the stuff that all Kotlin sub-projects have in common
        // ...
    }    
}

Для плагина Java это проще, и вы можете использовать plugins.withType, поскольку это «основной» плагин Gradle, а класс JavaPlugin можно использовать как часть Gradle Импорт по умолчанию (import org.gradle.api.plugins.*)

Применяемый плагин kotlin на самом деле не KotlinPlugin, а KotlinPluginWrapper. Также для поиска типа необходимо использовать каноническое имя.

plugins.withType(org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper) {
    // All the stuff that all Kotlin sub-projects have in common
    ...
}

Чтобы поймать все реализации оболочки, также можно использовать KotlinBasePluginWrapper.

Одно из решений - начать использовать собственный плагин для вашего проекта. Именно это и сделала команда AndroidX.

import org.gradle.api.Plugin
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.plugin.KotlinBasePluginWrapper
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

class MyPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        project.plugins.all {
            when (it) {
                    ...
                is KotlinBasePluginWrapper -> {
                    project.tasks.withType(KotlinCompile::class.java).configureEach { compile ->
                        compile.kotlinOptions.allWarningsAsErrors = true
                        compile.kotlinOptions.jvmTarget = "1.8"
                    }
                }
            }
        }
    }

Чтобы получить эту настройку, вам нужно будет настроить все основные элементы, но в долгосрочной перспективе окупаемость будет высока.

Читать далее

https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-master-dev/buildSrc/src/main/kotlin/androidx/build/AndroidXPlugin.kt#186

https://thewikihow.com/video_sQC9-Rj2yLI&feature=youtu.be&t=429

Другие вопросы по теме