Gradle 維護一個虛擬檔案系統 (VFS) 來計算在專案重複建置時需要重新建置的內容。透過監控檔案系統,Gradle 在建置之間保持 VFS 的最新狀態。

啟用

自 Gradle 7 起,Gradle 預設會為支援的操作系統啟用檔案系統監控。

使用 '--watch-fs' 旗標執行建置,以強制檔案系統監控建置。

若要強制所有建置監控檔案系統(除非使用 --no-watch-fs 停用),請將下列值新增到 gradle.properties

gradle.properties
org.gradle.vfs.watch=true

停用

若要停用檔案系統監控

  • 請使用 --no-watch-fs 旗標

  • gradle.properties 中設定 org.gradle.vfs.watch=false

支援的操作系統

Gradle 使用原生作業系統功能來監控檔案系統。Gradle 在以下作業系統上支援檔案系統監控

  • Windows 10,版本 1709 和更新版本

  • Linux,已在以下發行版上測試

    • Ubuntu 16.04 或更新版本

    • CentOS Stream 8 或更新版本

    • Red Hat Enterprise Linux (RHEL) 8 或更新版本

    • Amazon Linux 2 或更新版本

  • macOS 10.14 (Mojave) 或更新版本,適用於 Intel 和 ARM 架構

支援的檔案系統

檔案系統監控支援下列檔案系統類型

  • APFS

  • btrfs

  • ext3

  • ext4

  • XFS

  • HFS+

  • NTFS

Gradle 也支援 VirtualBox 的共用資料夾。

不支援 Samba 和 NFS 等網路檔案系統。

符號連結

檔案系統監控與符號連結不相容。如果專案檔案包含符號連結,則符號連結檔案無法從檔案系統監控最佳化中受益。

不支援的檔案系統

當預設啟用時,檔案系統監控在遇到不支援檔案系統上的內容時會採取保守的動作。如果您從網路磁碟機掛載專案目錄或子目錄,可能會發生這種情況。當預設啟用時,Gradle 不會在建置之間保留有關不支援檔案系統的資訊。如果您明確啟用檔案系統監控,Gradle 會在建置之間保留有關不支援檔案系統的資訊。

記錄

若要在建置開始和結束時查看虛擬檔案系統 (VFS) 變更的資訊,請啟用詳細 VFS 記錄。

org.gradle.vfs.verbose Daemon 選項設為 true 以啟用詳細記錄。

您可以在命令列中使用下列指令執行此動作

$ gradle <task> -Dorg.gradle.vfs.verbose=true

或在專案根目錄或 Gradle 使用者主目錄中的 gradle.properties 檔案中設定屬性

gradle.properties
org.gradle.vfs.verbose=true

這會在建置開始和結束時產生下列輸出

$ gradle assemble --watch-fs -Dorg.gradle.vfs.verbose=true
Received 3 file system events since last build while watching 1 locations
Virtual file system retained information about 2 files, 2 directories and 0 missing files since last build
> Task :compileJava NO-SOURCE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :jar UP-TO-DATE
> Task :assemble UP-TO-DATE

BUILD SUCCESSFUL in 58ms
1 actionable task: 1 up-to-date
Received 5 file system events during the current build while watching 1 locations
Virtual file system retains information about 3 files, 2 directories and 2 missing files until next build

在 Windows 和 macOS 上,即使您未變更任何內容,Gradle 仍可能會報告自上次建置以來收到的變更。這些是關於 Gradle 快取變更的無害通知,可以安全地忽略。

疑難排解

Gradle 未偵測到某些變更

在 Gradle 社群 Slack 上讓我們知道如果建置正確宣告其輸入和輸出,則不應發生這種情況。因此,這可能是我們必須修正的錯誤,或者您的建置缺少某些輸入或輸出的宣告。

VFS 狀態因遺失狀態而中斷

您在建置期間收到讀取為 因遺失狀態而中斷 VFS 狀態 的訊息嗎?在 Gradle 社群 Slack 上讓我們知道這表示您的建置無法受益於下列原因之一的文件系統監控

  • Daemon 收到未知的文件系統事件

  • 發生太多變更,且監控 API 無法處理

在 macOS 上開啟太多檔案

如果您在 macOS 上收到 java.io.IOException: 開啟太多檔案 錯誤,請提高開啟檔案的限制。請參閱 這篇文章 以取得更多詳細資訊。

調整 Linux 上的 inotify 限制

文件系統監控在 Linux 上使用 inotify。根據您的建置大小,可能需要提高 inotify 限制。如果您正在使用 IDE,則您可能已經在過去提高了限制。

文件系統監控對每個監控目錄使用一個 inotify 監控。您可以透過執行以下動作查看每個使用者目前 inotify 監控的限制

cat /proc/sys/fs/inotify/max_user_watches

若要將限制提高至例如 512K 監控,請執行以下動作

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
sudo sysctl -p --system

每個使用的 inotify 監控會佔用 1KB 的記憶體。假設 inotify 使用所有 512K 監控,則文件系統監控可能會使用多達 500MB。在記憶體受限的環境中,您可能想要停用文件系統監控。