Как создать базовый файл Gradle в Kotlin DSL для многомодульного проекта?

Чтобы повторно использовать код в файлах Gradle, у меня обычно есть «базовый» файл Gradle для определенных модулей, и я просто применяю их и добавляю любые новые зависимости, которые могут потребоваться. Я занимаюсь преобразованием всех моих файлов gradle в новый Kotlin DSL, но получаю ошибки «Неразрешенная ссылка» для ключевых слов, использующих следующий «базовый» файл.

plugins {
    id("com.android.library")
    kotlin("kotlin.android")
    kotlin("kapt")
}

android {
    compileSdkVersion(App.compileSdk)
    defaultConfig {
        minSdkVersion(App.minSdk)
        targetSdkVersion(App.targetSdk)
        versionCode = App.versionCode
        versionName = App.versionName
        testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        getByName("release") {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
        }
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
}

dependencies {
    val implementation by configurations
    val testImplementation by configurations
    val androidTestImplementation by configurations

    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
    implementation(Libs.kotlin_stdlib_jdk8)
    implementation(Libs.appcompat_v7)
    testImplementation(Libs.junit)
    androidTestImplementation(Libs.com_android_support_test_runner)
    androidTestImplementation(Libs.espresso_core)
}

Вышеупомянутый файл находится в моем корневом проекте, и я просто использую следующие в функциональных модулях

apply(rootProject.file("base-android.gradle.kts"))

Это нормально работало в Groovy, но полностью ломалось при переходе на Kotlin, есть идеи о том, что я делаю неправильно или как правильно иметь "базовый" файл gradle в Kotlin DSL?

РЕДАКТИРОВАТЬ: добавление полного сообщения об ошибке

Script compilation errors:

  Line 10: android {
           ^ Unresolved reference: android

  Line 11:     compileSdkVersion(28)
               ^ Unresolved reference: compileSdkVersion

  Line 12:     defaultConfig {
               ^ Unresolved reference: defaultConfig

  Line 13:         minSdkVersion(21)
                   ^ Unresolved reference: minSdkVersion

  Line 14:         targetSdkVersion(28)
                   ^ Unresolved reference: targetSdkVersion

  Line 15:         versionCode = 1
                   ^ Unresolved reference: versionCode

  Line 16:         versionName = "1.0"
                   ^ Unresolved reference: versionName

  Line 17:         testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner"
                   ^ Unresolved reference: testInstrumentationRunner

  Line 20:     buildTypes {
               ^ Unresolved reference: buildTypes

  Line 21:         getByName("release") {
                   ^ Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: 
                       public inline fun <reified T : Any> NamedDomainObjectCollection<out Any>.getByName(name: String): TypeVariable(T) defined in org.gradle.kotlin.dsl
                       public inline fun <reified T : Any> NamedDomainObjectCollection<out Any>.getByName(name: String, configure: TypeVariable(T).() -> Unit): TypeVariable(T) defined in org.gradle.kotlin.dsl
                       public fun <T : Any> NamedDomainObjectCollection<out Any>.getByName(name: String, type: KClass<TypeVariable(T)>): TypeVariable(T) defined in org.gradle.kotlin.dsl
                       public fun <T : Any> NamedDomainObjectCollection<out Any>.getByName(name: String, type: KClass<TypeVariable(T)>, configure: TypeVariable(T).() -> Unit): TypeVariable(T) defined in org.gradle.kotlin.dsl
                       public inline fun <reified T : Any> ExtensionContainer.getByName(name: String): TypeVariable(T) defined in org.gradle.kotlin.dsl

  Line 22:             isMinifyEnabled = false
                       ^ Unresolved reference: isMinifyEnabled

  Line 23:             proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
                       ^ Unresolved reference: proguardFiles

  Line 23:             proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
                                     ^ Unresolved reference: getDefaultProguardFile

  Line 27:     compileOptions {
               ^ Unresolved reference: compileOptions

  Line 28:         sourceCompatibility = JavaVersion.VERSION_1_8
                   ^ Unresolved reference: sourceCompatibility

  Line 29:         targetCompatibility = JavaVersion.VERSION_1_8
                   ^ Unresolved reference: targetCompatibility

16 errors

person Nicholas Doglio    schedule 04.12.2018    source источник
comment
В настоящее время у меня такая же проблема. Вы нашли решение?   -  person Thomas Vos    schedule 28.12.2018
comment
Удалось заставить его работать, удалив все содержимое блока android { ... }, кроме compileSdkVersion. Затем подождите несколько секунд и снова добавьте содержимое.   -  person Thomas Vos    schedule 28.12.2018
comment
@ThomasVos Это сработало для вас? Я еще не решил это и просто попробовал ваше предложение, но все еще вижу те же ошибки.   -  person Nicholas Doglio    schedule 12.01.2019


Ответы (2)


проблема может возникнуть из-за попытки применить plugins.

plugins {
    id("com.android.library")
    kotlin("kotlin.android")
    kotlin("kapt")
}

apply(rootProject.file("base-android.gradle.kts"))

...
person Martin Zeitler    schedule 04.12.2018
comment
Просто попробовал еще раз, изменив plugins {} на apply {} с соответствующими плагинами, и я все еще получаю те же Неразрешенные справочные ошибки для ключевых слов. - person Nicholas Doglio; 04.12.2018
comment
@NicholasDoglio это не то, что я написал. достаточно вставить переменные в скрипт; а ключевые слова должны быть известны. проблема может заключаться скорее в том, что rootProject является библиотечным проектом. переместите этот сценарий на уровень модуля или, по крайней мере, в файл, отличный от build.gradle. - person Martin Zeitler; 04.12.2018
comment
Извините, если я неправильно понял ваш исходный комментарий. Повторная попытка с файлом base-android.gradle.kts в отдельном файле от корневого уровня build.gradle не исправляет неразрешенные опорные ошибки. - person Nicholas Doglio; 04.12.2018

Вот как я это делаю:

build.gradle.kts

apply(from = "${rootProject.projectDir}/common-setup.gradle.kts")

common-setup.gradle.kts

apply {
    fun android(configure: com.android.build.gradle.internal.dsl.BaseAppModuleExtension.() -> Unit): Unit =
            (project as org.gradle.api.plugins.ExtensionAware).extensions.configure("android", configure)

    android {
        //common setup here
    }
}
person Sir Codesalot    schedule 07.07.2020