gradle加速之拉取依赖的加速
# 玩转gradle repository
# 1 gradle加速之拉取依赖的加速
# 前言
镜像配置都是常规操作,必要时也可以上代理.
自己搭的nexus本质也是一种镜像,可以代理maven中央仓库.
各个仓库的测速,可以使用这个脚本:
通过测速,调整仓库的顺序
apply from: 'https://raw.githubusercontent.com/hss01248/flipperUtil/master/deps/depsLastestChecker.gradle'
# 情况1 : 每次点击sync project with gradle files 都去拉取某个pom,且那个pom对应的版本真的不存在
或者有带+号的动态版本依赖,也最好锁死版本
耗时:18s
1 去对应gradle缓存里去看这个库在不在: 确实不在
2 看com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46-androidx这个到底在哪个仓库中. 直接先去maven中央仓库搜索:
发现TMD根本就没有这个版本的库.
https://mvnrepository.com/artifact/com.github.CymChad/BaseRecyclerViewAdapterHelper?repo=mulesoft-public
解决方案:
方案1: 打印依赖树,看这个版本谁引入的,exclude掉
方案2: 直接强制指定这个库的版本为项目中实际用的版本,就不会去额外请求这个版本的pom. 如下:
all {
resolutionStrategy {
//gradle 刷新加速. 避免每次去刷新com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.46-androidx
//2.9.46-androidx不存在,所以每次都会去拉取 ;
force 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.49-androidx'
2
3
4
5
# 情况2: 每次点击sync project with gradle files或者build,都去拉一堆的pom,且这些pom对应的版本在gradle cache里能找到
每次点击sync project with gradle files,都要耗时3-5min,下载一堆已经存在的库(gradle cache里已经有对应的版本)
这时早就配置好了下面的
all{
resolutionStrategy{
// cache dynamic versions for 10 minutes
cacheDynamicVersionsFor 24, 'hours'
// don't cache changing modules at all
cacheChangingModulesFor 24, 'hours'
}
}
2
3
4
5
6
7
8
发现没有repository里没有配置mavenlocal, 配置一下就好了
类似这里提到的:
Gradle 总是在每次 build 下载 pom 文件 (opens new window)
最后,刷新只要10s左右
# jcenter挂掉,移除它
换成aliyun
allprojects {
repositories {
def REPOSITORY_URL = 'https://maven.aliyun.com/repository/jcenter'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
println("ArtifactRepository : " + url)
def url = repo.url.toString()
if (url.startsWith('https://jcenter.bintray.com')) {
remove repo
}
}
}
maven {
url REPOSITORY_URL
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
必须用dsl,不能用gradle.addBuildListener的方式,
比如下面这个,能移除,但会导致file开头的maven全部报错
apply from: 'https://raw.githubusercontent.com/hss01248/flipperUtil/dev/repo_remove_jcenter.gradle'
用这个dsl也可以移除重复repo,以及将repo排序
一般推荐把自己公司的nexus写到最前面
# gradle cache发到maven local或者nexus
写一个脚本,将gradle的cache全部拷贝到maven local
或者用maven 命令发布到nexus
这个脚本可以挂到gradle的buildFinish回调里
纯拷贝文件的话,无法生成metadata.xml
task cacheToMavenLocal(type: Sync) {
from new File(gradle.gradleUserHomeDir, 'caches/modules-2/files-2.1')
into "${rootDir}/local-m2"
// Last copy target wins
duplicatesStrategy = 'include'
eachFile {
List<String> parts = it.path.split('/')
// Construct a maven repo file tree from the path
it.path = parts[0].replace('.','/') +
'/' + parts[1] +
'/' + parts[2] +
'/' + parts[4]
}
includeEmptyDirs false
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18