未解决的参考:库 - buildSrc

Con*_*ems 9 android dependency-management kotlin build.gradle gradle-kotlin-dsl

我正在尝试切换到使用 Kotlin DSL 从对象 Kotlin 文件而不是 gradle 文件获取依赖项版本。当我进行 gradle 同步时,它无法解析引用,但我可以从 build.gradle.kts 单击文件(库)。我没有对 build.gradle 或 settings.gradle 进行任何其他更改。这个问题并不是杰克逊特有的,我在多个项目中尝试过这个问题,并在发布问题之前阅读文档并搜索答案。

我得到一个 build.gradle.kts:15:20: Unresolved reference: Libraries

这是我的项目的结构

build.gradle
settings.gradle
+buildSrc
    build.gradle.kts
    +src
        +main
            +kotlin
                Libraries.kt
Run Code Online (Sandbox Code Playgroud)

这是我的 build.gradle.kts 文件

import org.gradle.kotlin.dsl.`kotlin-dsl`

plugins {
    `kotlin-dsl`
    java
    `java-gradle-plugin`
}


repositories {
    mavenCentral()
}

dependencies {
    implementation(Libraries.Jackson.core)
//    implementation(Libraries.anotherJackson)
}
Run Code Online (Sandbox Code Playgroud)

这是 kotlin Libraries.kt 文件

object Libraries {
    val Jackson = JacksonLibraries
    const val anotherJackson = "com.fasterxml.jackson.core:jackson-core:2.11.1"

}

object JacksonLibraries {
    const val core = "com.fasterxml.jackson.core:jackson-core:${Versions.Jackson.core}"
}

object Versions {
    object Jackson {
        const val core = "2.11.1"
        const val annotations = "2.11.1"
        const val databind = "2.11.1"
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我在没有库文件的情况下尝试它,它工作得很好。

implementation("com.fasterxml.jackson.core:jackson-core:2.11.1")
Run Code Online (Sandbox Code Playgroud)

但这两个都不起作用

implementation(Libraries.Jackson.core)
implementation(Libraries.anotherJackson)
Run Code Online (Sandbox Code Playgroud)

提前致谢!

aSe*_*emy 9

您是否正在尝试./buildSrc/src/main/kotlin/Libraries.kt访问./buildSrc/build.gradle.kts?因为那是不可能的,也没有必要。

基本上,不能使用./buildSrc/src/main/kotlin/Libraries.ktin 的./buildSrc/build.gradle.kts原因与不能使用<root>/src/main/kotlin/Libraries.ktin的原因相同./<root>/build.gradle.kts。Gradle 构建脚本无法使用它们尝试构建的项目的输出。

但是buildSrc 被视为包含构建,因此 的内容./buildSrc/src/main/...将在<root>/build.gradle.kts

版本对齐

版本目录

可以在版本目录之间共享./buildSrc/build.gradle.kts版本<root>/build.gradle.kts

libs.versions.toml文件是执行此操作的最简单方法。

简而言之,

  1. 使用 Gradle 7.4+
  2. 创建<root>/gradle/libs.versions.toml文件
  3. 定义您的依赖项,例如
    [versions]
    groovy = "3.0.5"
    
    [libraries]
    groovy-core = { module = "org.codehaus.groovy:groovy", version.ref = "groovy" }
    
    Run Code Online (Sandbox Code Playgroud)
  4. <root>/build.gradle.kts或任何<root>/settings.gradle.kts include(...)-ed 子项目中,您现在可以访问依赖项(您可能需要刷新 IntelliJ 几次才能自动完成加载)。
    [versions]
    groovy = "3.0.5"
    
    [libraries]
    groovy-core = { module = "org.codehaus.groovy:groovy", version.ref = "groovy" }
    
    Run Code Online (Sandbox Code Playgroud)

您可以通过加载文件在任何项目中使用相同的版本目录。如果您想托管并下载它,那也可以!

版本平台

如果您想跨多个单独的项目对齐版本,可以按照此处的文档进行操作:https ://docs.gradle.org/current/userguide/platforms.html

版本平台比版本目录更加结构化。它们有点像 Gradle 版本的 Maven BOM,当然它们更灵活!

简而言之,

  1. 创建Gradle项目,并应用Java Platform PluginMaven Publish Plugin
  2. 定义你的限制
  3. 将其发布到 Maven 存储库
  4. 将其作为平台依赖项应用于任何项目
    dependencies {
      implementation(libs.groovy.core)
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 因此,在进入 `libs.versions.toml` 路径后,我可以引用 `buildSrc/build.gradle.kts` 中的版本/依赖项,但不能引用 `buildSrc/src/main/kotlin/...` 文件中的版本/依赖项 –我将定义添加到 `buildSrc/settings.gradle.kts` 中,还有其他地方需要放置它吗? (2认同)