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

我试图组织我的构建文件,因为我会在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会严格收集并应用脚本中的buildscript { ... }块。 所以,要在buildscript config.gradle.ktsbuildscript ,应该将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