Как повторно использовать части конфигурации Android в Kotlin Gradle DSL для нескольких модулей? - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть многомодульный проект Android и Kotlin Gradle DSL.Существует некоторая конфигурация, которая должна повторяться в каждом модуле, и я хотел бы повторно использовать код.Я хотел бы, например, использовать этот код:

android {
    sourceSets {
        getByName("main").java.srcDirs("src/main/kotlin")
        getByName("test").java.srcDirs("src/test/kotlin")
    }
}

В Образцы Kotlin DSL задокументированы два метода:

apply(from = "foo.gradle.kts")

и функции расширения в * 1009.* вот так:

fun Project.kotlinProject() {
   dependencies {
     "compile"(kotlin("stdlib"))
   }
}

Однако оба эти метода работают только для настройки верхнего уровня, я не могу получить доступ к материалам плагина Android.Я получаю ошибки как Unresolved reference: BaseExtension

Ответы [ 2 ]

0 голосов
/ 02 января 2019

В конце концов меня вдохновил код SUPERCILEX :

allprojects {
    val parent = (group as String).split(".").getOrNull(1)
    when {
        name == "app" -> {
            apply(plugin = "com.android.application")
            configureAndroidModule()
        }
        parent == "common-android" -> {
            apply(plugin = "com.android.library")
            configureAndroidModule()
        }
    }
}

fun Project.configureAndroidModule() {
    configure<BaseExtension> {
        sourceSets {
            getByName("main").java.srcDirs("src/main/kotlin")
            getByName("test").java.srcDirs("src/test/kotlin")
        }
    }
}​
0 голосов
/ 28 декабря 2018

Как насчет использования блока подпроектов?У меня есть многомодульный проект Android, и я использую код в своих скриптах сборки.

subprojects {
    apply plugin: 'com.android.library'
    android {
        sourceSets {
            getByName("main").java.srcDirs("src/main/kotlin")
            getByName("test").java.srcDirs("src/test/kotlin")
        }
    }
}

Неразрешенная ссылка: BaseExtension

Что касается приведенного выше сообщения об ошибке, если вы хотите использовать блок Android, вы должны объявить свои модули как приложение или библиотеку Androidприменяя плагины, как описано выше в скрипте сборки.

Если вы хотите, чтобы настройки повторялись только на некоторых модулях, вы можете использовать блок настройки следующим образом:

configure(subprojects - project(':${module_name}')) {
    dependencies {
        implementation 'com.x.y.z:abc:1.0.0'
    }
}

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

...