背景:
我们正在尝试迁移到 Gradle 的 Kotlin DSL,主要是为了额外的类型安全性。
我们的一些库定义非常大(在某些极端情况下有 20 多个 exclude
调用),因此我们目前有一个巨大的 dependency.gradle
Groovy 脚本,它声明了一个巨大的所有库的映射,然后可以像 libraries.blah
一样使用。我正在尝试想出一种可行的方法来在 Kotlin 中执行相同的操作。
调查:
依赖约束(java-platform
插件)允许集中依赖的版本号,但这对排除没有任何作用,而排除是大部分问题在我们的例子中。 (我确信我们最终也会在某个时候使用 java-platform
。)
我发现的最优雅的解决方案是 this one blog post which suggests declaring Kotlin objects ,像这样:
object Libraries {
val guava = "..."
}
然后您可以据说使用像Libraries.guava
这样的对象。但这实际上不起作用,至少在 Gradle 6.9.1 中是这样,因为 an issue in Kotlin itself 。 (我假设它可以在某些旧版本上运行,但被 Kotlin 编译器升级破坏了。)
票证上指定的解决方法如下:
class Libraries(dependencies: DependencyHandler) {
val guava = dependencies.create(...)
}
val libraries by project.extra { Libraries(dependencies) }
这让我更接近可行的解决方案,因为我的 dependency.gradle.kts
文件现在可以编译,但我仍然找不到使用Libraries
的方法我定义的类。如果您这样做:
val libraries: Libraries by project.extra
Kotlin 提示 Libraries
未定义。因此,就好像一个构建脚本甚至无法导出类以供另一构建脚本使用。
更多背景
实际的项目结构相当复杂,看起来有点像这样:
─ repo root
├─ mainproject1
│ ├─ subproject11
│ │ └─ build.gradle.kts
│ ├─ subproject12
│ │ └─ build.gradle.kts
│ ├─ build.gradle.kts (references dependencies.gradle.kts)
│ └─ settings.gradle.kts
├─ mainproject2
│ ├─ subproject21
│ │ └─ build.gradle.kts
│ ├─ subproject22
│ │ └─ build.gradle.kts
│ ├─ build.gradle.kts (references dependencies.gradle.kts)
│ └─ settings.gradle.kts
└─ shared
└─ gradle
└─ dependencies.gradle.kts
问题:
其他拥有超过 100 个依赖项的庞大构建的人如何解决这个问题?
最佳答案
解决方法:使用 buildSrc
实例化Libraries
对象。
- 创建以下目录结构:
.
├── buildSrc
│ ├── build.gradle.kts
│ └── src
│ └── main
│ └── kotlin
│ └── Libraries.kt
├── settings.gradle.kts
└── build.gradle.kts
buildSrc/build.gradle.kts
是简约的:
plugins {
`kotlin-dsl`
}
repositories {
mavenCentral()
}
Libraries.kt
:
object Libraries {
const val guava = "com.google.guava:guava:31.0.1-jre"
}
- 用法(根
build.gradle.kts
):
plugins {
`java-library`
}
dependencies {
implementation(Libraries.guava)
}
repositories {
mavenCentral()
}
关于kotlin - 如何在 Gradle Kotlin DSL 中重用库声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69653651/