介绍文件系统监视

目录

介绍

这是关于增量开发系列博客文章的第一篇,增量开发是软件开发过程中频繁进行小更改的部分。我们将讨论即将推出的 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。或者,添加

org.gradle.vfs.watch=true

到项目目录或 Gradle 用户主目录中的 gradle.properties,这样您就不需要在每次构建时传递命令行选项。就是这样:下一次构建将在启用文件系统监视的情况下运行。

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

请记住,只有在同一守护进程上的连续构建都启用了该功能时,您才会看到性能改进。

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

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

这不是关于本地增量构建快速反馈故事的结局。我们计划在后续的 Gradle 版本中进行更多改进!

讨论