1

我有一个 Gradle (v6.6.1)平台模块,我将它发布到我们的内部 maven 存储库。这是一个仅限约束的平台,旨在供我组织中的大量项目使用,以便我们可以标准化常见依赖项的版本。

到目前为止一切正常:我定期检查每个依赖项以查找更新的版本,更新我的build.gradle.kts文件中的这些版本,增加平台本身的版本号(主要或次要,取决于更改),并将新平台发布到Maven 回购。

但是,这样做是一个耗时且手动的过程。我更愿意指定我的版本范围约束build.gradle.kts(例如,最新的补丁版本或最新的次要版本),然后使用依赖锁定将每个依赖项的推荐版本更新为新的特定版本。

问题是,Gradle 似乎禁止这样做。即使我使用以下内容,它也只会产生一个空的api.lockfile

dependencyLocking {
    lockAllConfigurations()
}
task("resolveAndLockAll") {
    doFirst {
        require(gradle.startParameter.isWriteDependencyLocks,
                { "You must specify `--write-locks` to update the dependency version lock" })
        configurations["api"].setCanBeResolved(true) // `api` not resolvable by default
    }
    doLast {
        configurations.forEach {
            println("Reviewing configuration ${it}...")
            if (it.isCanBeResolved && it.name != "archives" && it.name != "default") {
                it.resolve()
            }
        }
    }
}

dependencies {
    constraints {
        api("com.google.guava:guava:${ property("guavaVersion") }")
        api("com.google.inject:guice:${ property("guiceVersion") }")
        ... // many more
    }
}

我想我理解这背后的逻辑:我的平台只发布约束(而不是依赖),所以依赖锁定不适用。但是,我想指定确切的约束,允许消费项目在我的平台项目的发布之间跳转,并推荐给他们确切的版本。

我也明白那些消费项目可以使用依赖锁定来获得可重现的构建(他们确实这样做),但我想再次指定确切的约束,以便版本上的每个人,比如我平台的 17.4 都使用完全相同的依赖项,并且他们可以就遇到的问题进行协调。

解决方法

我的最佳想法是拥有第二个私有模块,它定义了相同的依赖项集(作为实际依赖项)但具有更广泛的版本范围(例如[1.1, 2.0),而不是1.4.3)。我可以使用该模块生成一个锁定文件,然后编写一个脚本,该脚本将使用新解决的特定依赖版本更新platform's文件。build.gradle.kts

4

0 回答 0