Gradle 維護一個虛擬檔案系統 (VFS) 來計算在專案重複建置時需要重新建置的內容。透過監控檔案系統,Gradle 在建置之間保持 VFS 的最新狀態。
啟用
自 Gradle 7 起,Gradle 預設會為支援的操作系統啟用檔案系統監控。
使用 '--watch-fs' 旗標執行建置,以強制檔案系統監控建置。
若要強制所有建置監控檔案系統(除非使用 --no-watch-fs
停用),請將下列值新增到 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
檔案中設定屬性
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。在記憶體受限的環境中,您可能想要停用文件系統監控。