Gradle 维护一个虚拟文件系统 (VFS) 来计算在项目的重复构建中需要重建的内容。通过监视文件系统,Gradle 在构建之间保持 VFS 最新。

使能够

自 Gradle 7 起,Gradle 默认为受支持的操作系统启用文件系统监视。

使用“--watch-fs”标志运行构建,以强制文件系统监视构建。

要强制文件系统监视所有构建(除非使用 禁用--no-watch-fs),请将以下值添加到gradle.properties

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

禁用

要禁用文件系统监视:

  • 使用--no-watch-fs旗帜

  • 设置org.gradle.vfs.watch=falsegradle.properties

支持的操作系统

Gradle 使用本机操作系统功能来监视文件系统。 Gradle 支持以下操作系统上的文件系统监视:

  • Windows 10 版本 1709 及更高版本

  • Linux,在以下发行版上进行了测试:

    • Ubuntu 16.04 或更高版本

    • CentOS Stream 8 或更高版本

    • 红帽企业 Linux (RHEL) 8 或更高版本

    • Amazon Linux 2 或更高版本

  • Intel 和 ARM 架构上的 macOS 10.14 (Mojave) 或更高版本

支持的文件系统

文件系统监视支持以下文件系统类型:

  • APFS

  • BTFS

  • 外部3

  • 外部4

  • XFS

  • 高频FS+

  • NTFS

Gradle 还支持 VirtualBox 的共享文件夹。

不支持 Samba 和 NFS 等网络文件系统。

符号链接

文件系统监视与符号链接不兼容。如果您的项目文件包含符号链接,则符号链接文件不会从文件系统监视优化中受益。

不支持的文件系统

默认启用时,文件系统监视在遇到不受支持的文件系统上的内容时会采取保守的行为。如果您从网络驱动器挂载项目目录或子目录,则可能会发生这种情况。默认情况下启用时,Gradle 不会在构建之间保留有关不支持的文件系统的信息。如果您显式启用文件系统监视,Gradle 会在构建之间保留有关不支持的文件系统的信息。

记录

要在构建开始和结束时查看有关虚拟文件系统 (VFS) 更改的信息,请启用详细 VFS 日志记录。

org.gradle.vfs.verbose将Daemon 选项设置为true启用详细日志记录。

您可以使用以下命令在命令行上执行此操作:

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

gradle.properties或者在项目根目录或 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 状态下降

Dropped VFS state due to lost state您是否收到在构建期间 读取的消息?在 Gradle 社区 Slack 上告诉我们 这意味着您的构建无法从文件系统监视中受益,原因如下:

  • 守护进程收到未知的文件系统事件

  • 发生了太多的变化,并且观察 API 无法处理它

macOS 上打开的文件过多

如果您java.io.IOException: Too many open files在 macOS 上收到错误消息,请提高打开的文件限制。请参阅这篇文章了解更多详细信息。

调整 Linux 上的 inotify 限制

Linux 上的文件系统监视使用inotify。根据构建的大小,可能需要增加 inotify 限制。如果您使用的是 IDE,那么您过go可能已经不得不增加限制。

文件系统监视对每个监视目录使用一个 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 watch 最多占用 1KB 内存。假设 inotify 使用所有 512K 监视,那么文件系统监视可能会使用最多 500MB。在内存受限的环境中,您可能需要禁用文件系统监视。