iT邦幫忙

2023 iThome 鐵人賽

DAY 14
0

Day 13 提到在 settings.gradle 檔案使用 pluginManagement {} 來宣告 Android Gradle 外掛程式/插件(plugins) 使用的儲存庫。

那麼,在 build.gradle(Module :app) 檔案,我們看到眾多的依賴項。
要如何為這些依賴項指定儲存庫呢?

這時,就要靠 settings.gradle 檔案的 dependencyResolutionManagement {} 區塊。

settings.gradle

settings.gradle 檔案

pluginManagement {
    repositories {
        ...
    }
}

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        // APNG file for animation
        maven { url "https://jitpack.io/" }
        // 'io.github.youth5201314:banner:2.2.2' 依賴項 使用
        maven { url "https://s01.oss.sonatype.org/content/groups/public" }
        // 'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1' 依賴項 使用
        maven { url "https://jcenter.bintray.com" }
    }
}

rootProject.name = "com.my.work"

include ':app'

從這邊可以看到,不是所有的依賴項都會放在 google()mavenCentral() 遠端儲存庫。
你可以針對引進的依賴項,使用 maven {} 區塊來指定儲存庫。

By default, repositories declared by a project will override whatever is declared in settings. You can change this behavior to make sure that you always use the settings repositories

官方文件說明,預設情況下,project 層級宣告的儲存庫,會覆寫 settings.gradle 檔案中宣告的所有儲存庫。

但我們就是想要讓 settings.gradle 檔案集中管理儲存庫的宣告呀!

這時就要請出 repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) 來確保始終使用的是settings.gradle 檔案中宣告的儲存庫。示例如下:

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
}

If, for some reason, a project or a plugin declares a repository in a project, Gradle would warn you. You can however make it fail the build if you want to enforce that only settings repositories are used

出於某種原因,你經手的既有專案在 project 層級宣告了 project 或 plugins 使用的儲存庫。
Gradle 這時會提供警示。

但是,如果你想一律強制使用 settings.gradle 檔案所宣告的儲存庫,你可以令其在構建過程中失敗。
示例如下:

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
}

當然,你也可以維持既有的「project 層級宣告儲存庫」設置。示例如下:

dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)
}

Day 10 有蜻蜓點水地介紹 dependencyResolutionManagement{}
當中稍微帶到 RepositoriesMode.FAIL_ON_PROJECT_REPOS 的功用。

今天我們把 RepositoriesMode 的 3 個枚舉常數全部看完。

  • FAIL_ON_PROJECT_REPOS

If this mode is set, any repository declared directly in a project, either directly or via a plugin, will trigger a build error.

直接在 project 層級宣告的所有儲存庫,不論是直接宣告或透過 plugins 宣告,都會觸發構建錯誤。

  • PREFER_PROJECT

If this mode is set, any repository declared on a project will cause the project to use the repositories declared by the project, ignoring those declared in settings.

所有在 project 層級宣告的儲存庫,皆會被該專案拿去使用。同時略過 settings.gradle 檔案宣告的儲存庫。

  • PREFER_SETTINGS

If this mode is set, any repository declared directly in a project, either directly or via a plugin, will be ignored.

所有在 project 層級宣告的儲存庫,不論是直接宣告或透過 plugins 宣告,都會被略過。即強制專案只能使用 settings.gradle 檔案中宣告的儲存庫。

資料來源
Gradle - Enum RepositoriesMode
Gradle - Declaring repositories


上一篇
[Day 13] repositories 與 dependencies 之間的關係
下一篇
[Day 15] 使用 IDE 來修改 Android Gradle 外掛程式/插件版本
系列文
[Android] 怎麼蓋地基?論 build.gradle 與它的快樂夥伴們30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言