iT邦幫忙

2023 iThome 鐵人賽

DAY 7
1

以下是 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
  • allprojects
  • 1 個 task

buildscript

用途:配置該專案的構建腳本(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 這邊同時看到這兩樣儲存庫,擇一使用即可。
https://ithelp.ithome.com.tw/upload/images/20230921/20151956u8OanpPvjP.png

dependencies 區塊指定載入

  • Android Gradle
    classpath 'com.android.tools.build:gradle:7.0.4'
  • Kotlin
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
  • 其他 Library
    classpath 'com.google.gms:google-services:4.3.10'
    與 Google 服務相關的 Firebase 依賴項
    classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1'
    Firebase 旗下的應用程式 crash 追蹤 SDK - Crashlytics
    classpath 'gradle.plugin.com.onesignal:onesignal-gradle-plugin:0.14.0'
    處理目標 API 級別大於等於 31 時,在創建待處理意圖(PendingIntent)發生的錯誤

allprojects

用途:本專案及底下所有子專案的設定區塊。

這時候就有個問題了,repositoriesbuildscriptallprojects 都能設置。我又不確定哪個插件使用的路徑到底是吃哪邊的 repositories 區塊,有一個非常不推薦的解決方法是,在兩邊的 repositories 區塊都使用相同的路徑設置。

另一種較好的方法是,在 settings.gradle 檔案內進行設置。請見下回分曉。

資料來源
註1:java项目中的classpath到底是什么

Android Gradle dependencies 方式:classpath、implementation、api 的区别
Gradle配置中subprojects 和 allprojects 的区别


上一篇
[Day 6] 兩個 build.gradle,跑得快
下一篇
[Day 8] task 是什麼?
系列文
[Android] 怎麼蓋地基?論 build.gradle 與它的快樂夥伴們30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言