Как правильно вызвать метод groovy gradle из kotlin dsl

У меня есть отдельный отличный скрипт, который добавляет ароматы в мой проект Android. И я могу без проблем применить его в файлах build.gradle. Но вызывая его из файла kotlin build.gradle.kts, я получаю сообщение об ошибке.

У меня есть flavors.gradle файл

ext.configFlavors = {
    flavorDimensions "brand"
    productFlavors {
        myBrand {
            dimension "brand"
        }
}

И я могу легко вызвать это из файлов build.gradle

android{
...
with configFlavors

}

Но в файлах build.gradle.kts я получаю:

Could not find method flavorDimensions() for arguments [brand] on project ': myModule' of type org.gradle.api.Project.

Мой build.gradle.kts выглядит так:

import com.android.build.gradle.LibraryExtension

plugins {
    id("com.android.library")
    id("org.jetbrains.kotlin.android")
}
apply(from  = "${rootProject.projectDir}/buildSrc/flavors.gradle" )

val configFlavors: groovy.lang.Closure<LibraryExtension> by extra
android {
    compileSdk = Versions.compile_sdk_version

    defaultConfig {
        minSdk = Versions.min_sdk_version
        targetSdk = Versions.target_sdk_version

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles("consumer-rules.pro")
    }

    buildTypes {
        //Dev
        create("dev") {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
        }

        //Staging
        create("staging") {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
        }

        //Production
        create("production") {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
        }
    }
// I am able to call the closure but i got the error
    configFlavors()
    
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
    buildFeatures {
        viewBinding = true
    }
}

dependencies {
    implementation(fileTree("include" to listOf("*.jar"), "dir" to "libs"))
    implementation(project(":domain"))
//    list of dependencies

}

Какой код вы написали в своем build.gradle.kts? Каковы определения классов/интерфейсов configFlavours и productFlavors?

aSemy 09.12.2022 12:31
1
1
112
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Доступ к дополнительным свойствам можно получить с помощью следующего синтаксиса:

// get an extra property from the current project
val myProperty: String by extra 


// or from the root project
val myNewProperty: String by rootProject.extra

Однако configFlavours — это не простое примитивное значение, это Замыкание.

можно получить доступ к Closures в Kotlin, но не зная, к какому типу должен применяться Closure, невозможно его использовать.

// Replace `Any` with the actual type, if known
val configFlavours: groovy.lang.Closure<Any> by extra

println(configFlavours)
// > Configure project :
// flavours_atn69ibjqzvnwf0cp7hb75l45$_run_closure1@398b577e

В документации Gradle есть больше примеров


P.S. в вашем коде есть и flavour, и flavor - выберите написание, пожалуйста :)

Я отредактировал свой файл gradle.build.kts. Я использую синтаксис, который вы показываете, для вызова закрытия, но я получаю сообщение об ошибке, которое flavorDimensions не может быть найдено по типу org.gradle.api.Project. Но мне нужно вызвать замыкание по типу LibraryExtension, так как у него есть этот метод.

X3Btel 09.12.2022 15:28
Ответ принят как подходящий

В итоге я добавил еще одно замыкание, которое принимает в качестве параметра libraryExtension. И использовать его из файлов gradle.build.kts. Это не оптимально, но, похоже, работает.

ext.configFlavorsWithParam = { libraryExtension ->
    libraryExtension.flavorDimensions "brand"
    libraryExtension.productFlavors {
        brand1 {
            dimension "brand"
        }
}

И я называю это так

android{
...
configFlavorsWithParam(this)
}

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