在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.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