【发布时间】:2022-01-12 17:28:33
【问题描述】:
我正在探索将我们基于 Groovy DSL 的构建文件转换为 Kotlin,并希望逐步完成此操作。但是,我不知道如何在子项目build.gradle.kts 中读取顶级build.gradle 中设置的ext 变量。
我的实验存储库可用here
它有这样的布局:
.
├── README.md
├── build.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── groovy
│ └── build.gradle
├── kts
│ ├── build.gradle.kts
│ └── src
│ └── main
│ └── java
│ └── xyz
│ └── abc
│ └── def
│ └── Main.java
└── settings.gradle
顶级文件定义了一个 ext 变量,其中包含常见的库版本,如下所示:
plugins {
id("java")
}
ext.libraries = [ shared: "xyz.abc.def:art:1.2" ]
有两个子项目,一个使用 Groovy DSL,一个使用 Kotlin DSL。他们都试图声明对libraries.shared的依赖。
╰─➤ cat groovy/build.gradle
plugins {
id("java")
}
dependencies {
implementation(libraries.shared)
}
╰─➤ cat kts/build.gradle.kts
plugins {
id("java")
}
dependencies {
implementation(libraries.shared)
}
settings.gradle 包括这两个项目。
╰─➤ cat settings.gradle
include "groovy"
include "kts"
当我运行./gradlew projects 时,我得到了这个错误:
Line 6: implementation(libraries.shared)
^ Unresolved reference: libraries
当 kts 子项目的包含被注释掉时,它成功,显示 groovy 子项目。
我尝试了许多不同的方法来引用libraries,例如project.extra 或extra,但到目前为止还没有找到任何可行的方法。
编辑:
在研究了 Gradle API 文档之后,我想出了这个,它有效,但绝对是可怕的。
implementation((project.getParent()!!.extra.properties["libraries"]!! as HashMap<String, String>).get("shared")!!);
【问题讨论】: