[英]How to migrate protect level build.gradle file from Gradle Groovy to Gradle Kotlin DSL
[英]How to properly call groovy gradle method from kotlin dsl
我有單獨的 groovy 腳本,可以為我的 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
不是一個簡單的原始值,它是一個Closure 。
可以訪問 Kotlin 中的閉包,但不知道閉包應該適用於什么類型,就無法使用它。
// 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
PS 你的代碼既有flavour
又有flavor
- 請選擇一個拼寫:)
我最終添加了另一個將 libraryExtension 作為參數的閉包。 並從 gradle.build.kts 文件中使用它。 它不是最佳的,但它似乎工作。
ext.configFlavorsWithParam = { libraryExtension ->
libraryExtension.flavorDimensions "brand"
libraryExtension.productFlavors {
brand1 {
dimension "brand"
}
}
我這樣稱呼它
android{
...
configFlavorsWithParam(this)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.