如何将Gradle依赖更新到最新版本

50

有没有一种简单的方法让Gradle将依赖项更新到它们最新可用的版本?

为了构建可重复性,我在我的build.gradle文件中使用版本号来定义所有依赖关系,如下所示:

dependencies {
    compile 'namespace:package1:version'
    compile 'namespace:package2:version'
    compile 'namespace:package3:version'
}

我希望定期将每个包更新至最新版本。通常在发布后的新迭代开始时,这是我要做的第一件事。

但手动更新每个包真的很麻烦。理想情况下,我希望有一个命令可以为我更新build.gradle文件,但至少也需要一个命令来打印出哪些软件包需要更新以及最新的版本号。

在Ruby环境中,我会运行"bundler update"。


我已经编写了一个Python工具来更新依赖版本,你可以试一试。 https://github.com/Jintin/andle - Jintin
1
可能是重复的问题,参考如何检查Gradle依赖项是否有新版本 - Suhaib
@Suhaib 是正确的, https://dev59.com/gV4b5IYBdhLWcg3wzUUp#28683488 - patrickfdsouza
您可以使用此网站并搜索任何依赖项的最新版本:http://gradleplease.appspot.com/ - Jay Patel
4个回答

22

build.gradle中添加:

plugins {
  id 'com.github.ben-manes.versions' version '0.17.0'
}

然后您可以执行gradle dependencyUpdates以获取新版本的报告。与同名的Maven插件不同,目前似乎还没有自动更新build.gradle的方法。

更多文档:https://github.com/ben-manes/gradle-versions-plugin


6
现在有一种自动更新依赖关系的方法:https://github.com/patrikerdes/gradle-use-latest-versions-plugin。 - mernst
@mernst,你的解决方案是最好的,应该单独列出答案以获得它应有的可见性。 - Marco Lackovic

22

这是我所能想到的全部内容。如果有更少手动操作的方法,我将非常欣然接受其他答案。

  1. 在Android Studio中,将每个依赖版本都替换为加号加上最新版本,例如:compile 'namespace:package1:+'

  2. 同步或构建项目,这将导致所有依赖项解析到它们的最新版本。

  3. 在Android Studio中,在build.gradle中的每个依赖行上放置光标,然后按alt+enter,会弹出一个菜单,您可以选择用特定版本替换


7
请查看gradle-versions-plugin - Ben Manes
@Ben Manes:这应该是被接受的答案。很棒的插件,干得好! - Lukas Novak
1
这个答案是检查更新的最佳方式!记得在第二步构建项目,否则它将无法工作。 - Ray Li
在我的情况下,同步不一定会下载最新版本。似乎缓存设置了一些超时时间,直到重新检查服务器版本。 - Marian Klühspies
我认为这是一种相当冒险的方法。 你停止控制本地安装的版本,你的队友正在使用什么版本,以及服务器上会有什么版本,因为某个库更新会在发布之前到来。 我知道这与JavaScript框架中的^类似解决方案,但在那里我们有一个包锁定文件,它控制整个团队/环境等使用的确切版本。 - Filip Kubala

9

我不建议这样做,因为库可能会包含破坏你代码的更改。

一种常见的“容忍”的语法是

compile 'namespace:package:major_version.minor_version.revision'

会像是

compile 'namespace:package:1.0.+'

考虑到库作者将修订版用作漏洞修复和改进更新

注意: 我刚刚这样做了,你也可以这样做

compile 'namespace:package:+'

编辑:
您可能想要测试我最新评论概念验证
这是在5分钟内完成的,所以不要期望它是完美或灵活的。


1
是的,我明白你可以用“+”替换版本的一部分来解决构建时的最新版本,但这会破坏构建的可重复性。我想依赖于特定的版本,因为这是最佳实践,并偶尔更新每个软件包。 - Jared Kells
更新到特定版本?主要、次要或修订版本?compile 'namespace:package:1.0.+' 会更新到最新的修订版本,而 compile 'namespace:package:1.+' 则会更新到最新的次要版本,compile 'namespace:package:+' 则会更新到最新的主要版本。 - Gorcyn
我不想使用加号,因为这意味着每次运行构建时我都可能得到库的不同版本。在大部分开发过程中,版本必须保持不变,以便进行彻底的测试。 - Jared Kells
通常在发布后,我想要更新每个库到它们的最新版本。这将在几个月内完成。我在其他语言中使用的依赖工具支持此操作。NuGet 和 bundler 是其中的例子。 - Jared Kells
好的,我明白了,您不想在编译时使用最新版本,而是在启动工具时某个时刻,依赖于compile 'namespace:package:1.0.0'会自动更新为compile 'namespace:package:1.0.1'。 您应该更新您的问题以使其更加清晰明了 :) - Gorcyn
1
一个脚本会将 namespace:package:+ 修改为 gradlew --refresh-dependencies,然后再修改为 namespace:package:x.y.z,其中的 x、y 和 z 会从 .idea/libraries/*.xml 中读取。这是一个非常有趣的功能。 - Gorcyn

7
我也遇到了这个问题。即使是手动检查依赖项,最好的方法也是通过项目结构进行搜索依赖项名称,看是否有更新版本。
但是这种查询只检查Maven存储库中存在的依赖项。至少它已经适用于Google的存储库。

enter image description here

enter image description here

enter image description here

注意:如果您选择使用新版本添加依赖项,则会在您的应用程序Gradle中添加重复内容,因此请确保删除旧的依赖行。

###################

另一个可能的快速修复方式是通过命令行操作:

./gradlew app:dependencies

这将生成下面类似的输出。请注意,星号指向可能存在的新版本。

enter image description here


我认为星号并不意味着可能有新版本。在依赖树的底部,它说:(*) - 依赖项被省略(先前列出)。 - starkej2
谢谢 - 现在项目结构中有一个“建议”选项卡,它会建议所有更新。这比在 XML 文件中随意尝试版本要好得多。 - n13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接