kotlin - 如何在 Gradle Kotlin DSL 中重用库声明?

标签 kotlin gradle dependency-management

背景:

我们正在尝试迁移到 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对象。

  1. 创建以下目录结构:
.
├── 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/

    相关文章:

    android - Kotlin:如何在 RecyclerView.Adapter 中调用 getSupportFragmentManager()

    android - 由于 OpenSSL 项目中缺少 header 而导致编译错误

    hudson - Ivy发布到存储库不会更新本地缓存

    scala - 是否需要为 Scala 2.10 上导出的宏库导出 Quasiquotes 依赖项?

    java - 是否可以创建 ByteArrays 的 ByteArray 作为 kotlin 中的元素?

    java - Jna,随机无效内存访问错误

    java - Gradle + IntelliJ : HotSwap in a plain Java application

    java - Gradle Eclipse JSF项目java.lang.ClassNotFoundException javax.faces.webapp.FacesServlet

    java - 如何从 spring-boot-starter-parent 中排除特定的依赖项

    android - 房间 : how to check whether row exists