Gradle 使用兩個主要目錄來執行和管理其工作:Gradle 使用者首頁目錄專案根目錄

author gradle 2

Gradle 使用者首頁目錄

預設情況下,Gradle 使用者首頁(~/.gradleC:\Users\<USERNAME>\.gradle)儲存全域配置屬性、初始化腳本、快取和日誌檔。

可以使用環境變數 GRADLE_USER_HOME 進行設定。

請勿與 GRADLE_HOME 混淆,後者是 Gradle 的可選安裝目錄。

其大致結構如下

├── caches (1)
│   ├── 4.8 (2)
│   ├── 4.9 (2)
│   ├── ⋮
│   ├── jars-3 (3)
│   └── modules-2 (3)
├── daemon (4)
│   ├── ⋮
│   ├── 4.8
│   └── 4.9
├── init.d (5)
│   └── my-setup.gradle
├── jdks (6)
│   ├── ⋮
│   └── jdk-14.0.2+12
├── wrapper
│   └── dists (7)
│       ├── ⋮
│       ├── gradle-4.8-bin
│       ├── gradle-4.9-all
│       └── gradle-4.9-bin
└── gradle.properties (8)
1 全域快取目錄(用於所有非專案特定的內容)。
2 版本特定的快取(例如,為了支援增量建置)。
3 共用快取(例如,用於依賴項的成品)。
4 Gradle Daemon的登錄和日誌。
5 全域初始化腳本
6 工具鏈支援下載的 JDK。
7 Gradle Wrapper下載的發行版。
8 全域Gradle 配置屬性

清除快取和發行版

Gradle 會自動清理其使用者首頁目錄。

預設情況下,當 Gradle Daemon 停止或關閉時,清理會在背景執行。

如果使用 --no-daemon,則會在建置工作階段後在前台執行。

以下清理策略會定期套用(預設情況下,每 24 小時一次)

  • 檢查所有 caches/<GRADLE_VERSION>/ 目錄中版本特定的快取是否仍在使用中。

    如果未使用,則發行版本的目錄會在閒置 30 天後刪除,快照版本則在 7 天後刪除。

  • 檢查 caches/ 中的共用快取(例如,jars-*)是否仍在使用中。

    如果沒有 Gradle 版本仍在使用它們,則會將其刪除。

  • 檢查目前 Gradle 版本在 caches/ 中使用的共用快取中的檔案(例如,jars-3modules-2)上次存取的時間。

    根據檔案是否可以在本機重新建立或從遠端儲存庫下載,分別會在 7 天或 30 天後刪除。

  • 檢查 wrapper/dists/ 中的 Gradle 發行版是否仍在使用中,亦即,是否有對應的版本特定快取目錄。

    未使用的發行版會被刪除。

配置快取和發行版的清理

可以配置各種快取的保留期限。

快取分為五類

  1. 已發行的 Wrapper 發行版:對應於已發行版本(例如,4.6.28.0)的發行版和相關的版本特定快取。

    未使用的版本的預設保留期限為 30 天。

  2. 快照 Wrapper 發行版:對應於快照版本(例如,7.6-20221130141522+0000)的發行版和相關的版本特定快取。

    未使用的版本的預設保留期限為 7 天。

  3. 下載的資源:從遠端儲存庫下載的共用快取(例如,快取的依賴項)。

    未使用的資源的預設保留期限為 30 天。

  4. 建立的資源:Gradle 在建置期間建立的共用快取(例如,成品轉換)。

    未使用的資源的預設保留期限為 7 天。

  5. 建置快取:本機建置快取(例如,build-cache-1)。

    未使用的建置快取項目的預設保留期限為 7 天。

每種類別的保留期限可以透過 Gradle 使用者首頁中的初始化腳本獨立配置

gradleUserHome/init.d/cache-settings.gradle.kts
beforeSettings {
    caches {
        releasedWrappers.setRemoveUnusedEntriesAfterDays(45)
        snapshotWrappers.setRemoveUnusedEntriesAfterDays(10)
        downloadedResources.setRemoveUnusedEntriesAfterDays(45)
        createdResources.setRemoveUnusedEntriesAfterDays(10)
        buildCache.setRemoveUnusedEntriesAfterDays(5)
    }
}
gradleUserHome/init.d/cache-settings.gradle
beforeSettings { settings ->
    settings.caches {
        releasedWrappers.removeUnusedEntriesAfterDays = 45
        snapshotWrappers.removeUnusedEntriesAfterDays = 10
        downloadedResources.removeUnusedEntriesAfterDays = 45
        createdResources.removeUnusedEntriesAfterDays = 10
        buildCache.removeUnusedEntriesAfterDays = 5
    }
}

也可以配置叫用快取清理的頻率。

有三種可能的設定

  1. DEFAULT:清理會定期在背景執行(目前為每 24 小時一次)。

  2. DISABLED:永不清理 Gradle 使用者首頁。

    這在 Gradle 使用者首頁是暫時性的情況下,或希望延遲清理到明確的時間點時很有用。

  3. ALWAYS:清理會在每個建置工作階段結束時執行。

    這在希望確保在繼續之前已執行清理的情況下很有用。

    但是,這會在建置期間(而不是在背景中)執行快取清理,這可能會很耗費資源,因此只有在必要時才應使用此選項。

若要停用快取清理

gradleUserHome/init.d/cache-settings.gradle.kts
beforeSettings {
    caches {
        cleanup = Cleanup.DISABLED
    }
}
gradleUserHome/init.d/cache-settings.gradle
beforeSettings { settings ->
    settings.caches {
        cleanup = Cleanup.DISABLED
    }
}
快取清理設定只能透過初始化腳本進行配置,並且應放置在 Gradle 使用者首頁中的 init.d 目錄下。這有效地將快取清理的配置耦合到套用這些設定的 Gradle 使用者首頁,並限制了將來自不同專案的不同衝突設定套用到同一個目錄的可能性。

多個 Gradle 版本共用一個 Gradle 使用者首頁

在多個 Gradle 版本之間共用單一 Gradle 使用者首頁是很常見的。

如上所述,Gradle 使用者首頁中的快取是版本特定的。不同版本的 Gradle 將僅對與每個版本相關聯的版本特定快取執行維護。

另一方面,某些快取在版本之間共用(例如,依賴項成品快取或成品轉換快取)。

從 Gradle 8.0 版開始,可以配置快取清理設定以自訂保留期限。但是,舊版本具有固定的保留期限(7 天或 30 天,具體取決於快取)。這些共用快取可能會被具有不同設定的 Gradle 版本存取,以保留快取成品。

這表示

  • 如果自訂保留期限,則執行清理的所有版本都將具有相同的保留期限。由於與多個版本共用 Gradle 使用者首頁,因此不會有任何影響。

  • 如果為大於或等於 8.0 版的 Gradle 版本自訂保留期限,以使用短於先前固定期限的保留期限,則也不會產生任何影響。

    知道這些設定的 Gradle 版本將比先前固定的保留期限更早清理成品,而舊版本實際上不會參與共用快取的清理。

  • 如果為大於或等於 8.0 版的 Gradle 版本自訂保留期限,以使用長於先前固定期限的保留期限,則舊版本的 Gradle 可能會比配置的時間更早清理共用快取。

    在這種情況下,如果希望為較新版本維護這些共用快取項目更長的保留期限,則它們將無法與舊版本共用 Gradle 使用者首頁。它們將需要使用單獨的目錄。

與 8.0 版之前的 Gradle 版本共用 Gradle 使用者首頁的另一個考量是,用於配置快取保留設定的 DSL 元素在較早版本中不可用,因此必須在版本之間共用的任何初始化腳本中考慮到這一點。這可以透過有條件地套用符合版本的腳本來輕鬆處理。

符合版本的腳本應位於 init.d 目錄以外的其他位置(例如子目錄),這樣它就不會自動套用。

若要以版本安全的方式配置快取清理

gradleUserHome/init.d/cache-settings.gradle.kts
if (GradleVersion.current() >= GradleVersion.version("8.0")) {
    apply(from = "gradle8/cache-settings.gradle.kts")
}
gradleUserHome/init.d/cache-settings.gradle
if (GradleVersion.current() >= GradleVersion.version('8.0')) {
    apply from: "gradle8/cache-settings.gradle"
}

符合版本的快取配置腳本

gradleUserHome/init.d/gradle8/cache-settings.gradle.kts
beforeSettings {
    caches {
        releasedWrappers { setRemoveUnusedEntriesAfterDays(45) }
        snapshotWrappers { setRemoveUnusedEntriesAfterDays(10) }
        downloadedResources { setRemoveUnusedEntriesAfterDays(45) }
        createdResources { setRemoveUnusedEntriesAfterDays(10) }
        buildCache { setRemoveUnusedEntriesAfterDays(5) }
    }
}
gradleUserHome/init.d/gradle8/cache-settings.gradle
beforeSettings { settings ->
    settings.caches {
        releasedWrappers.removeUnusedEntriesAfterDays = 45
        snapshotWrappers.removeUnusedEntriesAfterDays = 10
        downloadedResources.removeUnusedEntriesAfterDays = 45
        createdResources.removeUnusedEntriesAfterDays = 10
        buildCache.removeUnusedEntriesAfterDays = 5
    }
}

快取標記

從 Gradle 8.1 版開始,Gradle 支援使用 CACHEDIR.TAG 檔案標記快取。

它遵循快取目錄標記規範中描述的格式。此檔案的目的是允許工具識別不需要搜尋或備份的目錄。

預設情況下,Gradle 使用者首頁中的目錄 cacheswrapper/distsdaemonjdks 都會使用此檔案標記。

配置快取標記

可以透過 Gradle 使用者首頁中的初始化腳本配置快取標記功能

gradleUserHome/init.d/cache-settings.gradle.kts
beforeSettings {
    caches {
        // Disable cache marking for all caches
        markingStrategy = MarkingStrategy.NONE
    }
}
gradleUserHome/init.d/cache-settings.gradle
beforeSettings { settings ->
    settings.caches {
        // Disable cache marking for all caches
        markingStrategy = MarkingStrategy.NONE
    }
}
快取標記設定只能透過初始化腳本進行配置,並且應放置在 Gradle 使用者首頁中的 init.d 目錄下。這有效地將快取標記的配置耦合到套用這些設定的 Gradle 使用者首頁,並限制了將來自不同專案的不同衝突設定套用到同一個目錄的可能性。

專案根目錄

專案根目錄包含專案中的所有原始程式檔。

它也包含 Gradle 產生的檔案和目錄,例如 .gradlebuild

雖然前者通常會簽入原始碼控制,但後者是 Gradle 用於支援增量建置等功能的暫時性檔案。

典型的專案根目錄的結構如下所示

├── .gradle (1)
│   ├── 4.8 (2)
│   ├── 4.9 (2)
│   └── ⋮
├── build   (3)
├── gradle
│   └── wrapper (4)
├── gradle.properties   (5)
├── gradlew (6)
├── gradlew.bat (6)
├── settings.gradle.kts (7)
├── subproject-one  (8)
|   └── build.gradle.kts    (9)
├── subproject-two  (8)
|   └── build.gradle.kts    (9)
└── ⋮
1 Gradle 產生的專案特定快取目錄。
2 版本特定的快取(例如,為了支援增量建置)。
3 此專案的建置目錄,Gradle 會將所有建置成品產生到其中。
4 包含Gradle Wrapper的 JAR 檔案和配置。
5 專案特定的Gradle 配置屬性
6 使用Gradle Wrapper執行建置的腳本。
7 專案的設定檔,其中定義了子專案的列表。
8 通常,專案會組織成一個或多個子專案。
9 每個子專案都有自己的 Gradle 建置腳本。

專案快取清理

從 4.10 版開始,Gradle 會自動清理專案特定的快取目錄。

在建置專案之後,會定期(最多每 24 小時一次)檢查 .gradle/8.13/ 中版本特定的快取目錄,以確定它們是否仍在使用中。如果它們已 7 天未使用,則會將其刪除。