如何在 Kotlin DSL 中设置 gradle 额外属性



我正在尝试像在 groovy 中一样组织我的构建文件,方法是将值放在一个单独的文件中以供重用。但是我无法理解在 kotlin DSL 中做同样事情的语法。

这是我在根build.gradle.kts中使用的:

applyFrom("config.gradle.kts")
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        val test = project.extra["minSdkVer"]
        classpath("com.android.tools.build:gradle:3.0.0-alpha4")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.2-5")
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
allprojects {
    repositories {
        google()
        jcenter()
        mavenCentral()
    }
}

以下是正在引用的config.gradle.kts中的内容:

mapOf(
        Pair("minSdkVer", 22),
        Pair("targetSdkVer", 25),
        Pair("compiledSdkVer", 25),
        Pair("buildToolsVer", "26-rc4")
).entries.forEach {
    project.extra.set(it.key, it.value)
}

但是有一个错误:

无法在额外的属性扩展上获取属性"minSdkVer",因为它 不存在

正确的解决方法:Gradle 会在执行脚本中的其他任何内容之前严格收集并应用脚本中的buildscript { ... }块。因此,要使您的属性在buildscript内可用config.gradle.kts,您应该applyFrom("config.gradle.kts")移动到buildscript { ... }块:

buildscript {
    applyFrom("config.gradle.kts")
    /* ... */
}

另一个

可能的错误是在另一个ExtensionAware的作用域中使用额外的属性作为extra["minSdkVer"],就像本例中的任务一样:

val myTask = task("printMinSdkVer") {
    doLast {
        println("Extra property value: ${extra["minSdkVer"]}")
    }
}

在这种情况下,extra.get(...)不使用任务的project.extra而是extra

若要解决此问题,请指定使用项目。直接使用:

println(project.extra["minSdkVer"])

并用于委派。

val minSdkVer by project.extra

最新更新