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 工件