Spring boot 使用Gradle Kotlin DSL定义不同项目的通用依赖项和插件版本

Spring boot 使用Gradle Kotlin DSL定义不同项目的通用依赖项和插件版本,spring-boot,gradle,dependency-management,gradle-kotlin-dsl,Spring Boot,Gradle,Dependency Management,Gradle Kotlin Dsl,我有一组相关的Gradle项目,并非所有项目都在同一个存储库中(因此不共享相同的Gradle.properties或settings.Gradle.kts文件)。 我的目标是让我的主构建脚本(build.gradle.kts文件)完全清除依赖项版本号,同时避免在多次设置或属性文件中指定相同的版本号 我正在寻找实现这一点的最佳实践,考虑到这些版本号可以出现在Gradle依赖项或插件声明中,并且经常需要在它们之间保持同步 作为一个用例,让我们配置需要spring引导的项目。 在这种情况下,我可以使用

我有一组相关的Gradle项目,并非所有项目都在同一个存储库中(因此不共享相同的
Gradle.properties
settings.Gradle.kts
文件)。 我的目标是让我的主构建脚本(
build.gradle.kts
文件)完全清除依赖项版本号,同时避免在多次设置或属性文件中指定相同的版本号

我正在寻找实现这一点的最佳实践,考虑到这些版本号可以出现在Gradle依赖项或插件声明中,并且经常需要在它们之间保持同步

作为一个用例,让我们配置需要spring引导的项目。 在这种情况下,我可以使用Gradle平台项目来定义常见的依赖版本。例如,我的平台项目的
build.gradle.kts
看起来有点像这样:

plugins {
    `java-platform`
}

javaPlatform {
    allowDependencies()
}

dependencies {
    api(platform("org.springframework.boot:spring-boot-dependencies:2.3.0.RELEASE"))

    constraints {
        api("io.mockk:mockk:1.10.0")
        api("org.junit.jupiter:junit-jupiter:5.6.2")
        api("io.kotest:kotest-runner-junit5-jvm:4.0.6")
        ...
    }
}
因此,我在一个平台项目中方便地指定了所有spring引导依赖项+我自己的依赖项

但是其他使用spring引导依赖关系的项目也需要
org.springframework.boot
插件,其版本应该比平台项目中所需的spring引导依赖关系更好

正如一开始所说,这些项目位于其他存储库中,因此它们与平台项目不共享相同的配置文件。 在这些项目中,我将在其
设置.gradle.kts
文件中添加以下块:

pluginManagement {
    plugins {
        id("org.springframework.boot").version("2.3.0.RELEASE")
        ...
    }
}
它可以工作,因为在导入平台项目后,我可以按照预期保持主构建文件的版本号干净(spring引导依赖项和spring引导插件本身都不需要再指定它们的版本)

然而,这感觉并不好。现在,我的平台项目和使用spring boot插件的项目设置文件中都硬编码了相同版本的spring boot(
2.3.0.RELEASE
)。现在我的问题是保持位于不同项目中的两个数字保持同步


哪一种是解决这个问题的“正确”梯度方法?有没有一种方法可以让Gradle平台项目也以类似的方式指定插件版本号,从而声明首选的依赖版本

我不确定这是否是您想要的,但您可以使用
gradle.properties
中定义的属性。然后使用
settings.gradle.kts中的
val version:String by settings
build.gradle.kts中的
val version:String by project
获取它。这并不完全是“正确”的gradle方式,有些人甚至不赞成使用属性来声明依赖项版本。我还知道,有些gradle插件允许您在插件使用相同版本时忽略依赖项上的版本。例如,使用kotlin gradle插件,您可以执行
实现(“org.jetbrains.kotlin:kotlin stdlib”)
,而无需指定版本。春天似乎也有类似的东西。嗨@Nicolas,谢谢你的反馈!我知道如果我的所有项目都在同一个repo中共享相同的配置文件,我可以使用gradle.properties文件,但事实并非如此。我编辑了我的帖子,使之更加清晰。我知道spring依赖关系管理pugin,它模拟Maven行为。但我想学习的是,如果可能的话,如何使用原生的Gradle平台支持实现这一点。