Last active
December 2, 2024 10:13
-
-
Save bennyhuo/af7c43cc4831661193605e124f539942 to your computer and use it in GitHub Desktop.
How to config mirrors for repositories in Gradle without changing the source code of your project?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
fun RepositoryHandler.enableMirror() { | |
all { | |
if (this is MavenArtifactRepository) { | |
val originalUrl = this.url.toString().removeSuffix("/") | |
urlMappings[originalUrl]?.let { | |
logger.lifecycle("Repository[$url] is mirrored to $it") | |
this.setUrl(it) | |
} | |
} | |
} | |
} | |
val urlMappings = mapOf( | |
"https://repo.maven.apache.org/maven2" to "https://mirrors.tencent.com/nexus/repository/maven-public/", | |
"https://dl.google.com/dl/android/maven2" to "https://mirrors.tencent.com/nexus/repository/maven-public/", | |
"https://plugins.gradle.org/m2" to "https://mirrors.tencent.com/nexus/repository/gradle-plugins/" | |
) | |
gradle.allprojects { | |
buildscript { | |
repositories.enableMirror() | |
} | |
repositories.enableMirror() | |
} | |
gradle.beforeSettings { | |
pluginManagement.repositories.enableMirror() | |
dependencyResolutionManagement.repositories.enableMirror() | |
} |
Gradle 旧版本兼容问题,我这边通过版本判断及反射读取相关字段,配置 dependencyResolutionManagement
,这样应该也可以,自己试了是生效的。
gradle.beforeSettings {
pluginManagement.repositories.enableMirror()
// 6.8 及更高版本执行 DependencyResolutionManagement 配置
if (gradle.gradleVersion >= "6.8") {
val getDrm = settings.javaClass.getDeclaredMethod("getDependencyResolutionManagement")
val drm = getDrm.invoke(settings)
val getRepos = drm.javaClass.getDeclaredMethod("getRepositories")
val repos = getRepos.invoke(drm) as RepositoryHandler
repos.enableMirror()
println("Gradle ${gradle.gradleVersion} DependencyResolutionManagement Configured $settings")
} else {
println("Gradle ${gradle.gradleVersion} DependencyResolutionManagement Ignored $settings")
}
}
运行结果
6.8 及以上
Gradle 8.0 DependencyResolutionManagement Configured settings 'Jetpack'
Repository Google [https://dl.google.com/dl/android/maven2/] is mirrored to https://mirrors.tencent.com/nexus/repository/maven-public/
Repository MavenRepo [https://repo.maven.apache.org/maven2/] is mirrored to https://mirrors.tencent.com/nexus/repository/maven-public/
Repository Gradle Central Plugin Repository [https://plugins.gradle.org/m2] is mirrored to https://mirrors.tencent.com/nexus/repository/gradle-plugins/
Repository Google [https://dl.google.com/dl/android/maven2/] is mirrored to https://mirrors.tencent.com/nexus/repository/maven-public/
Repository MavenRepo [https://repo.maven.apache.org/maven2/] is mirrored to https://mirrors.tencent.com/nexus/repository/maven-public/
...
6.8 以下
Gradle 6.1.1 DependencyResolutionManagement Ignored settings 'DemoApp'
> Configure project :
Repository Google [https://dl.google.com/dl/android/maven2/] is mirrored to https://mirrors.tencent.com/nexus/repository/maven-public/
Repository MavenRepo [https://repo.maven.apache.org/maven2/] is mirrored to https://mirrors.tencent.com/nexus/repository/maven-public/
Repository maven6 [https://plugins.gradle.org/m2/] is mirrored to https://mirrors.tencent.com/nexus/repository/gradle-plugins/
...
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Gradle 低于6.8 没有
dependencyResolutionManagement
相关的 API,旧项目有兼容问题。注释了好像影响不大🙊