【问题标题】:How are gradle extra properties set in the Kotlin DSL?Kotlin DSL 中的 gradle 额外属性是如何设置的?
【发布时间】: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”,因为它 不存在

【问题讨论】:

    标签: gradle kotlin gradle-kotlin-dsl


    【解决方案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 块中应用另一个脚本,而不是在外部。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多