gpt4 book ai didi

Gradle:有没有办法禁止传递依赖项中的版本范围?

转载 作者:行者123 更新时间:2023-12-02 01:44:57 26 4
gpt4 key购买 nike

当我在我的 Gradle 配置中声明快照存储库时,有没有办法防止版本范围的传递依赖解析为 SNAPSHOT 版本?或者,我可以完全禁止传递依赖项中的版本范围吗?例如,考虑这个非常简单的 Gradle 项目:

repositories {
mavenCentral()
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
}

apply plugin: "java"

dependencies {
compile "org.reactfx:reactfx:1.4"
compile "org.fxmisc.undo:undofx:1.0.1"
}

这将导致版本冲突和解决,因为 undofx 依赖于版本为 [1.4,1.5)reactfx(最新的 1.4 .x 版本可用)。以下是 reactfx 的依赖性洞察:

gradlew dependencyInsight --dependency reactfx
org.reactfx:reactfx:1.4.1-SNAPSHOT (conflict resolution)

org.reactfx:reactfx:1.4 -> 1.4.1-SNAPSHOT
\--- compile

org.reactfx:reactfx:[1.4,1.5) -> 1.4.1-SNAPSHOT
\--- org.fxmisc.undo:undofx:1.0.1
\--- compile

Maven 还将解析 reactfx:1.4.1-SNAPSHOT 作为 undofx 的依赖项。但是,一旦将 reactfx 依赖项添加到项目中,Maven 就会使用我声明为一级依赖项的版本来解决冲突。这是我用来测试它的 Maven POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>example</groupId>
<artifactId>example</artifactId>
<version>1.0-SNAPSHOT</version>

<repositories>
<repository>
<id>maven-central</id>
<url>http://repo1.maven.org/maven2</url>
</repository>
<repository>
<id>oss-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>

<dependencies>
<dependency>
<groupId>org.fxmisc.undo</groupId>
<artifactId>undofx</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>org.reactfx</groupId>
<artifactId>reactfx</artifactId>
<version>1.4</version>
</dependency>
</dependencies>

</project>

这也是我对 Gradle 所期望的那种解析行为,但只是基于假设。我想如果 undofx 允许任何 1.4.x 版本的 reactfx 和唯一声明的 reactfx 版本落在那个范围,冲突将通过使用我声明的版本来解决。

但是,如果任何传递依赖项使用范围版本,我对冲突解决的兴趣不如构建失败。我更愿意识别这些依赖项并将它们设置为特定版本。如果我没有造成上述冲突,我认为我不会注意到这个使用版本范围。

使用版本范围识别和处理传递依赖性的最简单方法是什么?

已更新

根据 Peter 的回答,这里是我用来执行此操作的代码的完整列表。请注意,它正在使用标记为 @Incubating 的 Gradle API 功能。

import org.gradle.api.artifacts.component.ModuleComponentSelector

if(!project.plugins.hasPlugin(JavaPlugin)) {
apply plugin: "java"
}

repositories {
mavenCentral()
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
}

dependencies {
compile "org.fxmisc.undo:undofx:1.0.1" // depends on reactfx:[1.4,1.5)
}

configurations {
//noinspection GroovyAssignabilityCheck
all {
/*
Once the dependencies in all configurations are resolved check the
version of all module (not project) components that were resolved
successfully. Modules already using a forced version will be skipped.
*/
incoming.afterResolve { // ResolvableDependencies
it.resolutionResult.allDependencies { // DependencyResult
if(it instanceof ResolvedDependencyResult
&& it.requested instanceof ModuleComponentSelector) {
if(!it.selected.selectionReason.forced) {
checkVersion((ModuleComponentSelector) it.requested)
}
}
}
}
}
}

/**
* Check the version of the requested module and throw and exception if it's
* using a version range.
*
* @param requested The module component to check.
*/
void checkVersion(ModuleComponentSelector requested) {
def version = requested.version

if(version.endsWith(")")
|| version.equals("LATEST")
|| version.equals("RELEASE")) {
throw new GradleException(
"${requested} uses a version range. Try force.")
}
}

最佳答案

您可以使用 configuration.getIncoming() API 比较声明的版本和已解析的版本(例如,在 configuration.getIncoming().afterResolve() Hook 中),以及如果它们不相同则失败。要获得“声明的版本获胜”(而不是 Gradle 的“最高版本获胜”)的 Maven 冲突解决行为,您可以使用 configuration.getResolutionStrategy().force() API。要强制明确解决每个版本冲突(使用 force()),请使用 configuration.getResolutionStrategy().failOnVersionConflict()。有关 API 详细信息,请参阅 Gradle Build Language Reference .

关于Gradle:有没有办法禁止传递依赖项中的版本范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26190313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com