首發於Enaium的個人博客
前言
Gradle是一個非常優秀的構建工具,但用過Maven的人都知道,Maven可以設置鏡像,加速下載速度,而Gradle卻沒有這個功能。因為Gradle沒有Maven這麼死板的概念,在Gradle中大部分功能都是通過腳本實現的,所以我們可以通過腳本來實現鏡像的功能。
首先需要了解一下什麼是Initialization scripts,Initialization scripts是Gradle的初始化腳本,它可以在Gradle啓動時執行,Gradle會在執行構建之前執行初始化腳本,也就是説我們可以在這個時候編寫替換倉庫地址的腳本,這樣就可以實現鏡像的功能。
腳本
首先我們需要再用户目錄下的.gradle的目錄下創建一個init.gradle.kts文件,然後在這個文件中編寫腳本。
首先使用apply給腳本添加一個EnterpriseRepositoryPlugin插件,之後編寫一個類實現Plugin接口,然後我們在apply方法中編寫替換倉庫地址的邏輯。
apply<EnterpriseRepositoryPlugin>()
class EnterpriseRepositoryPlugin : Plugin<Gradle> {
override fun apply(gradle: Gradle) {
}
}
首先我們創建一個派生類,在這個派生類中定義一些常量,這些常量是我們要替換的倉庫地址。
companion object {
const val CENTRAL = "https://maven.aliyun.com/repository/central"
const val GRADLE_PLUGIN = "https://maven.aliyun.com/repository/gradle-plugin"
}
之後在這裏使用gradle.settingsEvaluated方法,這個方法會在settings.gradle文件被解析之後執行,我們可以在這個方法中編寫替換插件倉庫地址的邏輯。
gradle.settingsEvaluated {
pluginManagement {
repositories {
all {
if (this is MavenArtifactRepository) {
val url = this.url.toString()
if (url.startsWith("https://repo1.maven.org/maven2") || url.startsWith("https://repo.maven.apache.org/maven2")) {
this.setUrl(CENTRAL)
}
if (url.startsWith("https://plugins.gradle.org/m2")) {
this.setUrl(GRADLE_PLUGIN)
}
}
}
}
}
}
在完成插件的倉庫地址替換之後,我們還需要替換項目的倉庫地址,邏輯和替換插件的倉庫地址一樣。
gradle.allprojects {
repositories {
all {
if (this is MavenArtifactRepository) {
val url = this.url.toString()
if (url.startsWith("https://repo1.maven.org/maven2") || url.startsWith("https://repo.maven.apache.org/maven2")) {
this.setUrl(CENTRAL)
}
if (url.startsWith("https://plugins.gradle.org/m2")) {
this.setUrl(GRADLE_PLUGIN)
}
}
}
}
}
這樣完成之後,我們就可以飛快的下載項目中的插件和依賴了。
apply<EnterpriseRepositoryPlugin>()
class EnterpriseRepositoryPlugin : Plugin<Gradle> {
companion object {
const val CENTRAL = "https://maven.aliyun.com/repository/central"
const val GRADLE_PLUGIN = "https://maven.aliyun.com/repository/gradle-plugin"
}
override fun apply(gradle: Gradle) {
gradle.settingsEvaluated {
pluginManagement {
repositories {
all {
if (this is MavenArtifactRepository) {
val url = this.url.toString()
if (url.startsWith("https://repo1.maven.org/maven2") || url.startsWith("https://repo.maven.apache.org/maven2")) {
this.setUrl(CENTRAL)
}
if (url.startsWith("https://plugins.gradle.org/m2")) {
this.setUrl(GRADLE_PLUGIN)
}
}
}
}
}
}
gradle.allprojects {
repositories {
all {
if (this is MavenArtifactRepository) {
val url = this.url.toString()
if (url.startsWith("https://repo1.maven.org/maven2") || url.startsWith("https://repo.maven.apache.org/maven2")) {
this.setUrl(CENTRAL)
}
if (url.startsWith("https://plugins.gradle.org/m2")) {
this.setUrl(GRADLE_PLUGIN)
}
}
}
}
}
}
}