如何从Kotlindsl正确调用groovy gradle方法

uqxowvwt  于 2022-12-11  发布在  Kotlin
关注(0)|答案(2)|浏览(256)

我有单独的groovy脚本,可以添加到我的android项目中。我可以在build.gradle文件中应用它,没有问题。但是从Kotlinbuild.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

}
oyt4ldly

oyt4ldly1#

可以使用以下语法访问额外属性:

// 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

Gradle文档中有更多示例
P.S.您的代码同时具有flavourflavor-请选择一个拼写:)

ecfsfe2w

ecfsfe2w2#

我最终添加了另一个闭包,它以libraryExtension作为参数。并从gradle.build.kts文件中使用它。它不是最优的,但似乎可以工作。

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

我这样称呼它

android{
...
configFlavorsWithParam(this)
}

相关问题