【问题标题】:Gradle - getting the latest release version of a dependencyGradle - 获取依赖项的最新发布版本
【发布时间】:2012-05-09 08:52:40
【问题描述】:

告诉Gradle 以下内容的最简单方法是什么:

检索“junit”依赖项并获取其最新的“发布”版本。

管理 Maven 和 Ivy 存储库对我来说有点陌生。我尝试了以下步骤,它们导致Could not resolve dependency ... 错误:

  • compile "junit:junit:latest.release" 并将存储库设置为仅mavenCentral() (但是,如果我说“junit:junit:4.10”,它会起作用)。

  • 使用存储库设置写入compile "junit:junit:latest.release",方式如下:

    ivy {
        // I also tried 'http://maven.org' and other possible variants.           
        url "http://repo1.maven.org" 
        layout "maven"
    }
    
  • 尝试使用 Spring Source Ivy 存储库:

    ivy {
        artifactPattern "http://repository.springsource.com/ivy/libraries/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
        ivyPattern "http://repository.springsource.com/ivy/libraries/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
    }
    

也许我误解了什么。为什么获取最新版本的依赖项会如此艰巨?

【问题讨论】:

标签: java maven dependencies ivy gradle


【解决方案1】:

Gradle 目前不支持 Maven 的 RELEASE(很少使用和弃用),但它支持 Ivy 的 latest.release。但是,一般建议是针对精确版本进行构建。否则,构建可能会变成彩票。

【讨论】:

  • Maven 也不支持 RELEASE。只有固定的版本号。
  • 我已经仔细检查过了。 Maven 在版本 2 和 3 中都支持 RELEASE
  • 你是对的。我把插件版本弄错了,因为 Maven 3 它不再允许 RELEASE/LATEST 了。但是使用这样的版本标识符当然是不好的做法。
  • Maven 发布存储库中的工件是完成了所有可能的自动化(也可能是手动)测试的工件。该过程应包括 API 兼容性检查、回归测试等。那么为什么构建可以成为彩票?仅当您“发布”未经充分测试的工件时。
  • Grade 支持“latest.release”(但不支持“RELEASE”)。这对于确保您自己的内部库是最新的、经过验证的版本非常有用 - 我当然不会提倡将其用于外部/第 3 方库,原因与 Peter 上面建议的相同。
【解决方案2】:

获取最新版本有时会非常有用 - 例如,如果您经常发布自己的依赖项。

你可以得到最新的版本

compile "junit:junit:+"

或者最好至少指定主要版本,例如

compile "junit:junit:4.+"

【讨论】:

  • 只是为了记录:这确实应该是双引号!我一直在为我的大部分依赖声明使用单引号,发现code 'junit:junit:4.+' 不起作用
  • @azonli 似乎用单引号对我有用,至少对于本地依赖项。你得到什么错误?
  • 不应该是“testCompile”而不是“compile”吗?因为发布中不需要工件
  • 您并不总是需要可重现的构建。
  • @SimonForsberg ...没错,但是当您处于开发阶段时,您可能希望 (a) 遵循 bleeding-edge 或 (b) 确保为v4.+ 为您的项目保持最新状态。 你达到Alpha、Beta、-RC或-RELEASE阶段;我完全同意您需要将这些版本“”到杆子上。我使用properties' file to set version specifiers: compile "junit:junit:${junitVer}"`。
【解决方案3】:

查看 Gradle-Versions-Plugin。它完全符合您的要求:https://github.com/ben-manes/gradle-versions-plugin

安装见github页面。基本上你需要将这两行添加到你的 build.gradle - 项目文件中:

apply plugin: 'com.github.ben-manes.versions'

buildscript {
    [...]
    dependencies {
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.8'
        [...]
    }
}
[...]

然后您可以通过在项目目录的终端中运行此命令来使用该插件:

./gradlew dependencyUpdates -Drevision=release

它会告诉你哪些依赖是过时的!

【讨论】:

  • 如果您不想在每个项目中都包含该插件,也可以将其添加到初始化脚本中。详情请见this answer to another question
  • 如果依赖项在同一个 repo 中,并且您总是想要最新版本怎么办?
【解决方案4】:

最新的 Gradle 用户指南提到并解释了加号登录版本:

来自7.2. Declaring your dependencies

dependencies {
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

...构建脚本还指出,任何 junit >= 4.0 都需要编译项目的测试。

来自23.7. How dependency resolution works

如果将依赖项声明为动态版本(如 1.+),Gradle 会将其解析为存储库中最新的可用静态版本(如 1.2)。对于 Maven 存储库,这是使用 maven-metadata.xml 文件完成的,而对于 Ivy 存储库,这是通过目录列表完成的。

【讨论】:

  • 重要提示:+ 不一定采用最新版本。请参阅我上面的评论。
【解决方案5】:

在 Android Studio 中:

如果您使用+ 作为版本,并且想知道实际使用的是哪个版本,请在侧边栏中选择Project,然后在External Libraries 下您会看到实际使用的版本号。

【讨论】:

  • 您指的是特定的 IDE 吗? :-)
  • Inego:是的,我将其添加到答案中;-)
猜你喜欢
  • 2015-04-16
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 2023-02-06
  • 2017-06-22
  • 2017-08-21
  • 1970-01-01
相关资源
最近更新 更多