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 版本仍使用它們,則會將它們刪除。

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

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

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

    會刪除未使用的發行版。

設定快取和發行版的清理

可以設定各種快取的保留期間。

快取分為四類

  • 已發行的 wrapper 發行版:與已發行的版本(例如 4.6.28.0)對應的發行版和相關特定版本快取。

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

  • 快照 wrapper 發行版:與快照版本(例如 7.6-20221130141522+0000)對應的發行版和相關特定版本快取。

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

  • 已下載資源:從遠端儲存庫下載的共用快取(例如快取的相依項)。

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

  • 已建立資源:Gradle 在建置過程中建立的共用快取(例如人工產物轉換)。

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

可以透過 Gradle User Home 中的初始化指令碼獨立設定每個類別的保留期間

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

也可以設定呼叫快取清理的頻率。

有三個可能的設定

  • 預設:會在背景中定期執行清理(目前每 24 小時一次)。

  • 停用:永遠不清理 Gradle User Home。

    這對於 Gradle User Home 為暫時性或希望延後清理到明確時間點的情況很有用。

  • 永遠:在每個建置階段結束時執行清理。

    在希望確保執行前已進行清理的情況下,這項功能很有用。

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

停用快取清理

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
    }
}
快取清理設定只能透過 init 腳本設定,且應放置在 Gradle 使用者主目錄中的 init.d 目錄下。這會將快取清理設定與適用這些設定的 Gradle 使用者主目錄有效結合,並限制不同專案中不同的衝突設定套用至同一個目錄的可能性。

多個 Gradle 版本共用一個 Gradle 使用者主目錄

在多個 Gradle 版本之間共用一個 Gradle 使用者主目錄是很常見的。

如上所述,Gradle 使用者主目錄中的快取是特定於版本的。不同版本的 Gradle 只會對與每個版本相關的特定於版本的快取執行維護。

另一方面,有些快取會在版本之間共用(例如,相依項人工製品快取或人工製品轉換快取)。

從 Gradle 版本 8.0 開始,快取清理設定可以設定為自訂保留期間。然而,較舊的版本有固定的保留期間(7 或 30 天,視快取而定)。這些共用快取可以讓具有不同設定的 Gradle 版本存取,以保留快取人工製品。

這表示

  • 如果自訂保留期間,則執行清理的所有版本都會有相同的保留期間。與多個版本共用 Gradle 使用者主目錄不會有任何影響。

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

    了解這些設定的 Gradle 版本會比先前固定的保留期間更早清理人工製品,而較舊的版本實際上不會參與共用快取的清理。

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

    在這種情況下,如果希望為較新的版本保留這些共用快取條目以獲得更長的保留期間,則它們將無法與較舊的版本共用 Gradle 使用者主目錄。它們需要使用一個獨立的目錄。

在與版本 8.0 之前的 Gradle 版本共用 Gradle 使用者主目錄時,另一個需要考量的因素是,用於設定快取保留期間設定的 DSL 元素在較早的版本中不可用,因此必須在版本之間共用的任何 init 腳本中考量這一點。這可以透過有條件地套用版本相容的腳本來輕鬆處理。

符合版本規範的腳本應放置在 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) }
    }
}
gradleUserHome/init.d/gradle8/cache-settings.gradle
beforeSettings { settings ->
    settings.caches {
        releasedWrappers.removeUnusedEntriesAfterDays = 45
        snapshotWrappers.removeUnusedEntriesAfterDays = 10
        downloadedResources.removeUnusedEntriesAfterDays = 45
        createdResources.removeUnusedEntriesAfterDays = 10
    }
}

快取標記

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

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

預設情況下,Gradle User Home 中的目錄 cacheswrapper/distsdaemonjdks 會標記此檔案。

設定快取標記

快取標記功能可透過 Gradle User Home 中的初始化腳本設定

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 User Home 中的 init.d 目錄下。這會有效地將快取標記設定與其設定套用的 Gradle User Home 連結,並限制不同專案的不同衝突設定套用到同一個目錄的可能性。

專案根目錄

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

它也包含 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.7/ 中的版本特定快取目錄,以判斷它們是否仍在使用中。如果這些目錄已 7 天未曾使用,系統就會將它們刪除。