Kotlin DSL 中的 gradle 额外属性是如何设置的?

Posted

技术标签:

【中文标题】Kotlin DSL 中的 gradle 额外属性是如何设置的?【英文标题】:How are gradle extra properties set in the Kotlin DSL? 【发布时间】:2017-11-19 05:24:48 【问题描述】:

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

这是我在 root 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”,因为它 不存在

【问题讨论】:

【参考方案1】:

正确修复: Gradle 在执行任何其他操作之前严格从您的脚本中收集并应用 buildscript ... 块。因此,要使 config.gradle.kts 中的属性在 buildscript 中可用,您应该将 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

【讨论】:

酷。花了我一秒钟来弄清楚你对范围界定的意思。将 applyFrom() 放在 buildscript 块中是可行的。这并不完全有意义,因为 project.extra 不应该受到 ExtensionAware 范围的影响,对吧? @Daykm,现在我看到你的情况有一个完全不同的问题:Gradle 在脚本中的任何其他内容之前严格收集并执行 buildscript 块,所以,ideed,正确的修复是在buildscript 块中应用另一个脚本,而不是在外部。

以上是关于Kotlin DSL 中的 gradle 额外属性是如何设置的?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 gradle 中的 groovy 任务转换为 Gradle Kotlin DSL 以生成 pom.xml?

如何从 Kotlin DSL build.gradle 中的所有依赖项中排除库?

如何将 Gradle 中的原生 JUnit 5 支持与 Kotlin DSL 结合使用?

Gradle 5 Kotlin DSL:多模块项目中的常见任务和 Maven 工件

如何使用 Gradle Kotlin DSL 对 Spring Boot 应用程序进行 Dockerize

Gradle Kotlin DSL:在独特的地方定义 Kotlin 版本