文件系统监视功能介绍

目录

引言

这是关于增量开发系列博文的第一篇,增量开发是指软件开发过程中频繁进行小改动的阶段。我们将讨论即将推出的Gradle构建工具功能,这些功能将显著改善在此用例中的反馈时间。

此博文已在功能在Gradle 6.7中变为生产就绪后进行了更新。

在Gradle 6.5中,我们引入了一个名为“文件系统监视”的实验性功能,该功能显著加速了增量构建。启用后,它允许Gradle在构建之间将已了解到的文件系统信息保留在内存中,而不是在每次构建时轮询文件系统。这大大减少了确定自上次构建以来哪些文件已更改所需的磁盘I/O量。

自Gradle 6.7起,此功能已可用于生产环境。我们计划在后续版本中默认启用此功能。

它是如何工作的? #

为了确定Gradle是否需要执行一个任务,它需要检查自上次构建以来其任何输入和输出文件是否发生变化。守护进程将关于文件系统的信息存储在内存中,直到当前构建结束,我们称之为虚拟文件系统

在没有文件系统监视的情况下,守护进程不知道在两次构建之间文件系统发生了什么,因此它必须在每次构建结束时丢弃所有已收集到的文件系统信息。当启用文件系统监视时,守护进程会指示操作系统通知它磁盘上的更改。由于守护进程知道自上次构建以来哪些文件发生了变化,它可以重新利用虚拟文件系统中关于未更改位置的信息,从而避免不必要的磁盘I/O。

Gradle自带了对Linux、macOS和Windows最新版本的必要集成。不支持其他操作系统。

文件系统监视功能演示 #

您可以通过传递命令行开关 --watch-fs 或设置Gradle属性来启用文件系统监视。启用后,Gradle守护进程将执行以下操作:

  • 开始监视文件系统更改。
  • 在构建期间和构建之间保留虚拟文件系统。

注意:我们启用了详细日志记录,以便查看文件系统监视的效果。

$ ./gradlew --watch-fs -Dorg.gradle.vfs.verbose=true :core:testClasses

Starting a Gradle Daemon

BUILD SUCCESSFUL in 24s
254 actionable tasks: 1 executed, 253 up-to-date

Received 11 file system events for current build while watching 1 hierarchies
Virtual file system retains information about 34797 files, 3845 directories and 128 missing files till next build

如您所见,Gradle守护进程在第一次构建期间了解了大量关于文件系统的知识。所有这些信息仅对用于运行此特定构建的守护进程可用。

现在,让我们修改一个源文件。Gradle将检测到此更改,并更新虚拟文件系统中关于该源文件的信息。然后再次运行构建。

$ ./gradlew --watch-fs -Dorg.gradle.vfs.verbose=true :core:testClasses

Received 14 file system events since last build while watching 1 hierarchies
Virtual file system retained information about 34796 files, 3838 directories and 128 missing files since last build

BUILD SUCCESSFUL in 6s
254 actionable tasks: 3 executed, 251 up-to-date

Received 117 file system events for current build while watching 1 hierarchies
Virtual file system retains information about 34797 files, 3845 directories and 128 missing files till next build

请注意,守护进程自上次构建以来收到了一些事件,并更新了虚拟文件系统的部分内容。尽管大部分信息仍然保持不变。

构建时间改进 #

该功能的影响取决于多种因素,但总的来说,它应该会显著缩短增量构建的构建时间。例如,在Santa Tracker Android项目中,我们发现针对一个小更改,构建时间有了以下改进:

Santa tracker linux FS watching improvements

在此实例中,我们多次运行了相同的构建,平均而言,在启用文件系统监视的情况下,我们观察到执行时间平均快了约150毫秒(或20%)。

尝试文件系统监视功能 #

如果您想了解您的项目如何从文件系统监视中受益,以下是如何尝试的方法。

首先,请确保您运行的是Gradle 6.7或更高版本。要启用文件系统监视,您需要在命令行中传递 --watch-fs。或者,在项目目录或Gradle用户主目录下的 gradle.properties 文件中添加:

org.gradle.vfs.watch=true

这样,您就不需要在每次构建时都传递命令行选项了。就是这样:下次构建将以启用文件系统监视的方式运行。

注意:在Gradle 6.5和6.6中,可以通过 org.gradle.unsafe.watch-fs=true 启用实验性功能。

请记住,只有当在同一守护进程上连续构建都启用了此功能时,您才能看到性能提升。

如果您遇到任何问题,请查看用户手册中的故障排除部分。如果您仍然有问题,请通过Gradle社区Slack与我们联系。

我们也很乐意听取您在构建中看到的改进。请在Gradle社区Slack分享您的成功案例。如果您想对您的构建进行基准测试,可以按照此存储库中的说明,使用Gradle profiler轻松进行。

这并不是关于本地增量构建快速反馈的全部故事。我们在后续的Gradle版本中还安排了进一步的改进!

讨论