【发布时间】:2012-11-13 22:38:46
【问题描述】:
如何告诉 gradle 从存储库重新下载依赖项?
【问题讨论】:
标签: gradle
如何告诉 gradle 从存储库重新下载依赖项?
【问题讨论】:
标签: gradle
通常,您可以使用命令行选项--refresh-dependencies 刷新缓存中的依赖项。您还可以删除~/.gradle/caches 下的缓存文件。在下一次构建中,Gradle 会尝试再次下载它们。
您的具体用例是什么?你用的是动态依赖版本还是SNAPSHOT版本?
在 Unix 系统上,您可以使用以下方式删除 Gradle 下载的所有现有工件(工件和元数据):
rm -rf $HOME/.gradle/caches/
请注意,--refresh-dependencies 不会总是重新下载每个工件;如果它们与存储库中存在的副本匹配,它将使用现有副本。来自 Gradle 用户指南,refreshing dependencies:
--refresh-dependencies 选项告诉 Gradle 忽略已解析模块和工件的所有缓存条目。将对所有配置的存储库执行新的解析,重新计算动态版本,刷新模块并下载工件。但是,在可能的情况下,Gradle 将在再次下载之前检查先前下载的工件是否有效。这是通过将存储库中发布的 SHA1 值与现有下载工件的 SHA1 值进行比较来完成的。
[...]
认为使用 --refresh-dependencies 会强制下载依赖项是一种常见的误解。情况并非如此:Gradle 只会执行刷新动态依赖项严格要求的操作。这可能涉及下载新的列表或元数据文件,甚至是工件,但如果没有任何改变,影响是微乎其微的。
【讨论】:
find $HOME/.gradle/caches/ -name "*LIBRARY_NAME*" -exec rm -r {} \;
对于 Windows...为了让 gradle 重新下载特定依赖项:
从以下目录中删除要重新下载的依赖项:
C:\Users\%USERNAME%\.gradle\caches\modules-2\files-2.1
删除路径下的所有元数据目录:
C:\Users\%USERNAME%\.gradle\caches\modules-2\metadata-*
在项目的根目录中运行 gradle build(或 gradlew build,如果使用 gradle 包装器)。
注意:上面文件路径中的数字可能对您有所不同。
【讨论】:
~/.gradle/caches/modules-2/files-2.1
对于 gradle 版本 6.3、kotlin 版本 1.3.70、Groovy 2.5.10,似乎 change 更改为 isChange
工作配置是
implementation("com.sample:commons:1.0.0-SNAPSHOT") {
isChanging = true
}
另外,运行这个命令来获取最新的
./gradlew assemble --refresh-dependencies
【讨论】:
要刷新缓存的“发布”版本,唯一的选择是清除本地缓存。
rm -rf $HOME/.gradle/caches/
要刷新缓存的“快照”版本,您可以:
./gradlew build --refresh-dependencies
【讨论】:
在我的情况下,以上都不起作用,我所做的是:
build.gradle 中,注释与我的未解决导入相关的依赖项然后我的导入再次正确解决。
【讨论】:
对于那些想知道在哪里运行 gradle 命令的人:
gradlew build --refresh-dependencies
【讨论】:
只有手动删除缓存文件夹中的特定依赖项才能工作...由同事在企业存储库中构建的工件。
【讨论】:
您可以通过将依赖项标记为“正在更改”来告诉 Gradle 重新下载构建脚本中的一些依赖项。 Gradle 将每 24 小时检查一次更新,但这可以使用 resolutionStrategy DSL 进行配置。我发现将它用于 SNAPSHOT 或 NIGHTLY 构建很有用。
configurations.all {
// Check for updates every build
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
扩展:
dependencies {
implementation group: "group", name: "projectA", version: "1.1-SNAPSHOT", changing: true
}
精简:
implementation('group:projectA:1.1-SNAPSHOT') { changing = true }
我在forum thread 找到了这个解决方案。
【讨论】:
cacheChangingModulesFor 是关键,changing: true 是可选的,因为它被-SNAPSHOT 暗示,这里可以使用简写:compile 'group:projectA:1.1-SNAPSHOT' 因为上面的暗示。也可以将 resolutionStrategy 限制为一个配置:configurations.compile.resolutionS...。
compile 'com.burrowsapps:ads:1.0:true'?
适用于 Android Studio 3.4.1
只需打开gradle选项卡(可以位于右侧)并右键单击列表中的父级(应称为“Android”),然后选择“刷新依赖项”。
这应该可以解决您的问题。
【讨论】:
【讨论】:
删除所有缓存会重新下载所有依赖项。所以它需要很长时间,而且很无聊,再次等待重新下载所有依赖项。
我怎么能通过以下方式解决这个问题。
只需删除需要刷新的组。
Ex : 如果我们想刷新 com.user.test 组
rm -fr ~/.gradle/caches/modules-2/files-2.1/com.user.test/
然后从 build.gradle 中删除依赖项并重新添加它。 然后它将刷新我们想要的依赖项。
【讨论】:
Mb 我来晚了,但是我的解决方案是针对单个存储库的。我认为删除 ~/.gradle/* 是矫枉过正。 我遇到的问题是我正在删除源所在的目录,而 gradle 正在获取另一个版本,而不是来自 nexus。 为了避免这种情况,我运行下一个:
~/.gradle$ find . -type d -name 'group.plugins.awssdk'
./caches/modules-2/files-2.1/group.plugins.awssdk
./caches/modules-2/metadata-2.23/descriptors/group.plugins.awssdk
~/.gradle$ rm -r ./caches/modules-2/files-2.1/group.plugins.awssdk ./caches/modules-2/metadata-2.23/descriptors/group.plugins.awssdk
在 gradle 从 nexus 拖动文件之后。
【讨论】:
如果您使用的是最新版本的 Gradle,则可以使用 --refresh-dependencies 选项。
./gradlew build --refresh-dependencies
您可以参考Gradle manual。
--refresh-dependencies 选项告诉 Gradle 忽略已解析模块和工件的所有缓存条目。将对所有已配置的存储库执行新的解析,重新计算动态版本,刷新模块,并下载的工件。
【讨论】:
如果你正在使用 eclipse 并且你想强制 eclipse 重新加载依赖项,你可以尝试下面的命令
gradlew clean cleaneclipse build eclipse --refresh-dependencies
【讨论】:
这对我有用。 通过取消选中 File>Settings>Gradle>Offline Work 中的按钮,确保 Gradle 未设置为脱机。
将此添加到您的 build.gradle 的顶层,很高兴拥有上述依赖项
configurations.all {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
我确保我的依赖项是这样写的:
implementation('com.github.juanmendez:ThatDependency:ThatBranch-SNAPSHOT') {
changing = true
}
之后,我在 Android Studio 中打开 Gradle 面板并单击蓝色圆圈箭头按钮。我总是可以看到我的更新获得了新的副本。
【讨论】:
你可以这样做
https://marschall.github.io/2017/04/17/disabling-gradle-cache.html
引用Disabling the Gradle Build Cache
当您经常使用 Gradle 构建大型项目时,Gradle 构建缓存可能是一件很棒的事情。但是,如果只是偶尔构建开源 > 项目,它会很快变大。
要禁用 Gradle 构建缓存,将以下行添加到
~/.gradle/gradle.propertiesorg.gradle.caching=false您可以使用清理现有缓存
rm -rf $HOME/.gradle/caches/ rm -rf $HOME/.gradle/wrapper/
【讨论】:
有两种方法可以做到这一点:
使用 --refresh-dependencies 选项:
./gradlew build --refresh-dependencies
简短说明 --refresh-dependencies 选项告诉 Gradle 忽略已解析模块和工件的所有缓存条目。
长解释
使用删除: 当你删除缓存时
rm -rf $HOME/.gradle/caches/
您只需清理所有缓存的 jar 和 sha1 总和,Gradle 处于您的机器上没有工件并且必须下载所有内容的情况。是的,它第一次会 100% 工作,但是当另一个 SNAPSHOT 发布并且它是您的依赖关系树的一部分时,您将再次面临刷新或清除缓存的选择。
【讨论】:
在大多数情况下,只需简单地重新构建项目就可以解决问题。有时您必须运行./gradlew build --refresh-dependencies,因为已经提到了几个答案(需要很长时间,具体取决于您拥有多少依赖项)。然而,有时这些都不起作用:依赖项不会得到更新。然后,您可以这样做:
NonExistingClass 原因)这很荒谬,看起来很疯狂,但我实际上每天都在使用这个程序,只是因为我需要的依赖项可以更新数十次,而任何适当的解决方案都不会产生任何效果。
【讨论】:
可以删除带有缓存 jar 的文件夹。
就我而言,在 Mac 上该库缓存在路径:
/Users/MY_NAME/.gradle/caches/modules-2/files-2.1/cached-library-to-remove
我删除了缓存的库文件夹(上例中的“cached-library-to-remove”),删除了我的项目的构建文件夹并再次编译。 然后下载了新的库。
【讨论】:
对于 MAC
./gradlew build --refresh-dependencies
适用于 Windows
gradlew build --refresh-dependencies
也可以试试gradlew assembleDevelopmentDebug --refresh-dependencies
【讨论】:
gradle wrapper 任务生成一个;你甚至可以使用另一个 Gradle 包装器生成一个包装器:gradlew wrapper
删除此目录:
C:\Users\[username]\.gradle
【讨论】:
您需要重新下载它,这样您就可以手动下载并替换损坏的文件,然后再次同步您的项目。去这个位置 C:\users[用户名].gradle\wrapper\dist\gradle3.3-all\55gk2rcmfc6p2dg9u9ohc3hw9\gradle-3.3-all.zip 此处删除 gradle3.3allzip 并通过从该站点再次下载来替换它 https://services.gradle.org/distributions/ 找到相同的文件并将其下载并粘贴到该位置 然后同步您的项目。 希望它也对你有用。
【讨论】:
您可以删除特定组或工件 ID 的缓存,而不是像这里的一些答案所建议的那样删除整个 gradle 缓存。我在.bash_profile 中添加了以下功能:
deleteGradleCache() {
local id=$1
if [ -z "$id" ]; then
echo "Please provide an group or artifact id to delete"
return 1
fi
find ~/.gradle/caches/ -type d -name "$id" -prune -exec rm -rf "{}" \; -print
}
用法:
$ deleteGradleCache com.android.support
然后,在下一次构建或重新同步时,gradle 将重新下载依赖项。
【讨论】:
我认为 gradle 2.14.1 解决了这个问题。接受的答案是正确的,但是 gradle 中存在一个带有--refresh-dependencies 的错误。 2.14.1 修复了这个问题。
见https://discuss.gradle.org/t/refresh-dependencies-should-use-cachechangingmodulesfor-0s/556
【讨论】: