У меня есть отдельный отличный скрипт, который добавляет ароматы в мой проект 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
}
Доступ к дополнительным свойствам можно получить с помощью следующего синтаксиса:
// 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
, так как у него есть этот метод.
В итоге я добавил еще одно замыкание, которое принимает в качестве параметра libraryExtension. И использовать его из файлов gradle.build.kts. Это не оптимально, но, похоже, работает.
ext.configFlavorsWithParam = { libraryExtension ->
libraryExtension.flavorDimensions "brand"
libraryExtension.productFlavors {
brand1 {
dimension "brand"
}
}
И я называю это так
android{
...
configFlavorsWithParam(this)
}
Какой код вы написали в своем
build.gradle.kts
? Каковы определения классов/интерфейсовconfigFlavours
иproductFlavors
?