介绍文件系统监控

这是关于增量开发的一系列博客文章的第一篇,增量开发是软件开发过程中的一个部分,您会在其中进行频繁的小改动。我们将讨论即将推出的 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 分析器,按照 此仓库 中的说明进行操作。

这并不是关于本地增量构建快速反馈的结束。我们将在接下来的 Gradle 版本中进行进一步的改进!

讨论