以下是 build.gradle(Project:專案名稱) 的示例:
buildscript {
ext.kotlin_version = "1.5.21"
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.4'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
classpath 'com.google.gms:google-services:4.3.10'
// Add the Crashlytics Gradle plugin.
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
// 修復錯誤: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE
classpath 'gradle.plugin.com.onesignal:onesignal-gradle-plugin:0.14.0'
}
}
allprojects {
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
可以看到有 3 個區塊
用途:配置該專案的構建腳本(buildscript)類別路徑(classpath,註1)
從範例中看到 repositories
指定腳本(script)依賴項(dependencies)的儲存庫來源。
google() 指向 https://dl.google.com/dl/android/maven2/
儲存庫
mavenCentral() 的原始碼敘述指向org.gradle.api.artifacts.ArtifactRepositoryContainer#MAVEN_CENTRAL_URL,即 https://repo.maven.apache.org/maven2/
gradlePluginPortal() 指向 https://plugins.gradle.org/m2/
。
與 maven { url 'https://plugins.gradle.org/m2/' }
的指定路徑相同。
所以如果在 repositories
這邊同時看到這兩樣儲存庫,擇一使用即可。
dependencies
區塊指定載入
classpath 'com.android.tools.build:gradle:7.0.4'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
classpath 'com.google.gms:google-services:4.3.10'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
classpath 'gradle.plugin.com.onesignal:onesignal-gradle-plugin:0.14.0'
用途:本專案及底下所有子專案的設定區塊。
這時候就有個問題了,repositories
在 buildscript
和 allprojects
都能設置。我又不確定哪個插件使用的路徑到底是吃哪邊的 repositories
區塊,有一個非常不推薦的解決方法是,在兩邊的 repositories
區塊都使用相同的路徑設置。
另一種較好的方法是,在 settings.gradle
檔案內進行設置。請見下回分曉。
資料來源
註1:java项目中的classpath到底是什么
Android Gradle dependencies 方式:classpath、implementation、api 的区别
Gradle配置中subprojects 和 allprojects 的区别